【发布时间】:2014-11-07 01:49:40
【问题描述】:
问题:可以在应用服务器容器之外使用zxJDBC.connectx 方法吗?
我在 Jython 中有自己的服务器应用程序,我希望升级到使用数据库连接池(因为此时我正在手动构建和销毁单个连接)。我找到了一些示例代码并让它工作(使用 Tomcat 的连接池),但它的工作方式让我很困扰。对我来说,看起来池是一遍又一遍地创建的。这是我的工作示例:
from __future__ import with_statement
from com.ziclix.python.sql import zxJDBC
params = { }
params['url'] = 'jdbc:mysql://localhost:3306/my_database'
params['driverClassName'] = 'com.mysql.jdbc.Driver'
params['username'] = 'mario'
params['password'] = 'myP@ssw0rd'
params['validationQuery'] = 'SELECT 1'
params['jdbcInterceptors'] = \
'org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;' + \
'org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer'
# This is the line that worries me!
conn = zxJDBC.connectx('org.apache.tomcat.jdbc.pool.DataSource', **params)
with conn.cursor() as cursor:
cursor.execute('SELECT * FROM MyTable')
data = cursor.fetchall()
print data
conn.close()
看看“让我担心的线”。我想使用zxJDBC 连接对象,但是如果每次获得它我都必须提供 DataSource 类名称以及设置参数,那么我认为的第一件事就是每次都重新创建一个连接池.这显然不是我想要的。
有没有人确切地知道发生了什么,或者我可以如何确认正在发生的事情 - 也许通过一些实验?如果我想在我的服务器中使用它,我应该复制 servlet 容器的 JNDI 基础结构吗?我是否无法理解 DataSource 到底是什么以及它是如何工作的?我不知道如何深入了解它。谢谢!
编辑:Jython 源代码
我查看了 Jython 源代码。 connectx 方法由 com.ziclix.python.sql.connect.Connectx 类支持。相关的 sn-p 如下所示:
/**
* Construct a javax.sql.DataSource or javax.sql.ConnectionPooledDataSource
*/
@Override
public PyObject __call__(PyObject[] args, String[] keywords) {
Connection c = null;
PyConnection pc = null;
Object datasource = null;
PyArgParser parser = new PyArgParser(args, keywords);
try {
String klass = (String) parser.arg(0).__tojava__(String.class);
datasource = Class.forName(klass).newInstance();
} catch (Exception e) {
throw zxJDBC.makeException(zxJDBC.DatabaseError, "unable to instantiate datasource");
}
/*
* The code continues on, setting up the connection pool's parameters,
* handling errors, etc., and obtaining a connection (variable: c).
*/
try {
if (c == null || c.isClosed()) {
throw zxJDBC.makeException(zxJDBC.DatabaseError, "unable to establish connection");
}
pc = new PyConnection(c);
} catch (SQLException e) {
throw zxJDBC.makeException(zxJDBC.DatabaseError, e);
}
return pc;
}
从源代码构建 Jython 并不是那么容易(似乎没有充分记录的依赖关系),或者我会放入一些调试语句来比较 datasource 对象。但是当我尝试自己复制创建部分时......
datasource = Class.forName(klass).newInstance();
...在我看来,每次调用都会创建唯一的 DataSource 实例(因此可能是唯一的池实例)。
有没有人对 Jython 有任何经验并且肯定知道?谢谢。
【问题讨论】:
标签: java tomcat database-connection jython connection-pooling