2

我在 servlet 引擎(在本例中为 Tomcat)中运行了一系列方法,使用连接池访问以这种方式编写的数据库:

// Gets an RSS_Feed.
public static RSS_Feed get(int rssFeedNo) {
    ConnectionPool_DB pool = ConnectionPool_DB.getInstance();
    Connection connection = pool.getConnection();
    PreparedStatement ps = null;
    ResultSet rs = null;

    String query = ("SELECT * " +
                    "FROM RSS_Feed " +
                    "WHERE RSSFeedNo = ?;");

    try {
        ps = connection.prepareStatement(query);
        ps.setInt(1, rssFeedNo);
        rs = ps.executeQuery();
        if (rs.next()) {
            return mapRSSFeed(rs);
        }
        else {
            return null;
        }
    }
    catch(Exception ex) {
        logger.error("Error getting RSS_Feed " + rssFeedNo + "\n", ex);
        return null;
    }
    finally {
        Database_Utils.closeResultSet(rs);
        Database_Utils.closeStatement(ps);
        pool.freeConnection(connection);
    }
}

是否可以在 servlet 引擎之外调用这样的方法?我想在从命令行而不是在 servlet 引擎中执行的批处理中执行此操作。我知道我可以简单地重写查询而不使用连接池,但这是该过程中涉及的众多查询之一。

连接池是通过 Apache Common DBCP 实现的。

ConnectionPool_DB.getInstance();阅读:

private ConnectionPool_DB() {
    try {
        InitialContext ic = new InitialContext();
        dataSource = (DataSource) ic.lookup(PropertiesFile.getProperty("myApp", "DATASOURCE"));
        // dataSource = (DataSource) ic.lookup("java:/comp/env/jdbc/myApp");
    }
    catch(Exception ex) {
        logger.error("Error getting a connection pool's datasource\n", ex);
    }
}
4

3 回答 3

1

我在一个项目中有这样的事情:

Context ctx = new InitialContext(); 
DataSource ds = (DataSource) ctx.lookup("DbConnection");
ConnectionPool connectionPool = new ConnectionPool(ds)

在上下文 xml 中,我像这样定义资源

<Resource name="DbConnection" 
auth="SERVLET" 
type="javax.sql.DataSource"  
scope="Shareable"            
driverClassName="**driverClassName**" 
url="**url**" 
username="**username**" 
password="**password**" 
maxActive="10" 
maxIdle="10" 
maxWait="1000"
/>

所以我假设你有类似的东西如果你需要编写代码来自己创建数据源。

这应该可以帮助您解决 http://docs.oracle.com/javase/tutorial/jdbc/basics/sqldatasources.html

于 2012-10-22T20:00:52.463 回答
0

您的意思是要在您的 servlet 引擎和批处理作业之间共享一个连接池吗?或者您想在批处理作业中使用连接池?

至于在 Tomcat 和批处理作业之间共享一个池:嗯,我不明白你会怎么做。Tomcat 和批处理作业都有自己的 Java 虚拟机实例。他们不共享内存、课程等,所以我不知道这样一个公共池会放在哪里。

如果您的意思是在批处理作业中:当然。我认为这样的事情很少需要。在批处理作业中,我通常在程序开始时打开一个连接并在最后关闭它。创建连接池没有太大价值。桌面应用程序有点棘手。我经常在应用程序启动时创建一个连接,并在它们退出时关闭它,但可以说,当用户只是盲目地盯着屏幕时(就像我经常在午餐前一个小时左右做的那样),这会建立一个连接,所以其他时候每次用户单击导致某些事情发生的键时,我都会打开一个连接,然后在返回“等待”模式之前释放它。同样,池化也没什么意义,因为在桌面应用程序中,没有其他用户可以共享池。

但是能做到吗?当然。我已经在桌面应用程序中完成了它,其中许多事情可能在不同时间发生,因此传递单个连接很尴尬。

于 2012-10-22T20:05:10.017 回答
0

当然,它可以通过稍微修改 JNDI 连接来使用。但是Tomcat应该运行。

于 2012-10-22T20:10:19.323 回答