2014-11-07 63 views
0

問題:您可以在應用程序服務器容器之外使用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的經驗,並確定知道?謝謝。

回答

0

基於我的研究,我提出了以下解決方案。

我沒有使用大多數Jython示例代碼中顯示的更直接的方法,而是使用Java方法實例化DataSource。 (我從Apache Tomcat站點上的示例代碼中獲得了此信息)。然後,我不使用zxJDBC方法來獲取連接對象,而是使用該方法依賴的方法:即com.ziclix.python.sql.PyConnection類。

結果是從池中,然後將其包在PyConnection對象,允許一個Jython連接的方便性和其光標對象繪製的傳統的Java連接對象。

from __future__ import with_statement 

from com.ziclix.python.sql import PyConnection 
import org.apache.tomcat.jdbc.pool as pool 

# https://people.apache.org/~fhanik/jdbc-pool/jdbc-pool.html 
p = pool.PoolProperties() 
p.setUrl('jdbc:mysql://localhost:3306/my_database') 
p.setDriverClassName('com.mysql.jdbc.Driver') 
p.setUsername('mario') 
p.setPassword('[email protected]') 
p.setValidationQuery("SELECT 1") 
p.setJdbcInterceptors('org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;' + 
         'org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer') 

datasource = pool.DataSource() 
datasource.setPoolProperties(p) 

# http://www.jython.org/javadoc/com/ziclix/python/sql/PyConnection.html 
conn = PyConnection(datasource.getConnection()) 

with conn.cursor() as cursor: 
    cursor.execute('SELECT * FROM MyTable') 
    data = cursor.fetchall() 
    print data 

conn.close() 

我對這種方法更有信心。我有什麼理由不應該?