【问题标题】:Jython and standalone DB connection pool: How to confirm the pool is a SingletonJython 和独立数据库连接池:如何确认该池是 Singleton
【发布时间】: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


    【解决方案1】:

    根据我的研究,我提出了以下解决方案。

    我没有使用大多数 Jython 示例代码中显示的更直接的方法,而是使用 Java 方法实例化 DataSource。 (我取自 Apache Tomcat 站点上的示例代码。)然后,我没有调用 zxJDBC 方法来获取连接对象,而是使用该方法所依赖的:即com.ziclix.python.sql.PyConnection 类。

    结果是从池中提取的传统 Java 连接对象,然后将其包装在 PyConnection 对象中,从而为 Jython 连接及其游标对象提供便利。

    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('myP@ssw0rd')
    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()
    

    我对这种方法更有信心。我有什么理由不应该这样做?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-20
      • 1970-01-01
      • 2014-01-05
      • 1970-01-01
      • 2010-10-23
      • 2014-09-13
      相关资源
      最近更新 更多