gpt4 book ai didi

java - PreparedStatement 和 Axis2

转载 作者:行者123 更新时间:2023-11-28 23:47:01 25 4
gpt4 key购买 nike

我将 Axis2 与 Apache Tomcat 结合使用。我需要 web 服务的客户端能够查询数据库,所以我在网上找到,通过将以下资源添加到 Tomcat 的上下文中,它会自动创建一个连接池:

Resource name="jdbc/TestDB" auth="Container"               type="javax.sql.DataSource"                removeAbandoned="true"                removeAbandonedTimeout="30"               maxActive="80"                  maxIdle="30"               maxWait="10000"               username="user"               password=""               driverClassName="org.postgresql.Driver"               url = "jdbc:postgresql://localhost:5432/mydb"               useUnicode="true"               characterEncoding="utf-8"               characterSetResults="utf8"               validationQuery="/* ping */ SELECT 1" 

它似乎可以工作,但现在我想做的是重用相同的 PreparedStatement,这样它就不会在每次客户端发出请求时都被解析。因此,我将所有客户端连接的 PreparedStatement 设为静态,当我创建它时,我调用 statement.setPoolable(true),据我所知,这是多余的(PreparedStatement 已经是可池化的)。我希望通过这种方式,PreparedStatement 不会绑定(bind)到单个连接。仍然,我收到错误:

java.sql.SQLException:地址为 * 的 org.apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement 已关闭。

奇怪的是,如果我在进行任何设置之前调用 statement.isClosed(),它会返回 false。然后,我设置了一些东西,它抛出了那个异常。

代码是:



尝试{
连接连接;

上下文 envCtx = (上下文) new InitialContext().lookup("java:comp/env");

DataSource ds = (DataSource) envCtx.lookup("jdbc/TestDB");
conn = ds.getConnection();

如果(语句== null){
//语句是静态的,所以在第二次调用时它不会为空
statement = conn.prepareStatement(query);
statement.setPoolable(true);
}
如果(语句。isClosed()){
statement = conn.prepareStatement(query);
//它永远不会到达这里
}
别的{
Logger.getLogger(HelloAxisWorld.class.getName()).log(Level.INFO, "STATEMENT IS NOT CLOSED", new Object());
//它总是到达这里
}

statement.setString(1, par1);//这里,第二次调用抛出异常
结果集 rs = statement.executeQuery();
while (rs.next()) {
cur_value = rs.getInt("cur_value");
}
rs.close();

conn.close();

} catch (异常前){
Logger.getLogger(HelloAxisWorld.class.getName()).log(Level.SEVERE, null, ex);
}

我不明白为什么 statement.isClosed 返回 false,但随后异常显示它已关闭。也许这不是重用 preparedStatement 的方法,但是我该怎么做呢?我读到,如果我在同一查询上调用 conn.prepareStatement,jdbc 将从缓存中返回 PreparedStatement(不会再次解析),但我不确定它是否属实。

最佳答案

有一个名为 c3p0 的项目专门用于处理您遇到的其中一种情况。网址在这里https://sourceforge.net/projects/c3p0/在这里 http://www.mchange.com/projects/c3p0/它处理数据源 JNDI 绑定(bind)、连接池和语句池。还有一个关于 stackoverflow 的引用,有人将这个库与 servlets 一起使用 what-is-a-good-strategy-for-caching-prepared-statements-in-tomcat

关于java - PreparedStatement 和 Axis2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12949143/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com