問題:您可以在應用程序服務器容器之外使用zxJDBC.connectx
方法嗎?我有我自己的服務器應用程序在Jython中,我期待升級到使用數據庫連接池(因爲我建立和破壞個人連接手動,在這一點上)。我找到了一些示例代碼,並已經得到它的工作(使用Tomcat的連接池),但它的工作方式困擾着我。對我來說,它看起來像游泳池一遍又一遍地被創造出來。這是我的工作示例:Jython和獨立數據庫連接池:如何確認池是Singleton
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'] = '[email protected]'
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
類支持。有關片段看起來是這樣的:
/**
* 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的經驗,並確定知道?謝謝。