gpt4 book ai didi

Java.sql.connection 对象第二次不工作

转载 作者:行者123 更新时间:2023-11-29 03:08:01 26 4
gpt4 key购买 nike

我已经在我的程序中为 jboss 应用程序服务器声明了 Resource 注释。我正在使用这些注释创建连接对象。当我第一次使用连接时,它会建立连接并通过使用 java.sql.ResultSetMetaData 我能够获取值。但是第二次我得到异常作为“java.sql.SQLException:连接与托管连接无关。org.jboss.jca.adapters.jdbc.jdk6.WrappedConnectionJDK6@19adb”。为什么我会收到此异常。

我的 jboss standalone.xml 文件和我的 java 程序如下,

独立.xml:

<datasources>
<datasource jndi-name="java:jboss/datasources/dcimpl" pool-name="dcimpl_pool" enabled="true" jta="true" use-java-context="true" use-ccm="true">
<connection-url>
jdbc:mysql://localhost:3306/dcimpl?zeroDateTimeBehavior=convertToNull
</connection-url>
<driver>
mysqldriver
</driver>
<transaction-isolation>
TRANSACTION_READ_COMMITTED
</transaction-isolation>
<pool>
<min-pool-size>
10
</min-pool-size>
<max-pool-size>
50
</max-pool-size>
<prefill>
true
</prefill>
<use-strict-min>
false
</use-strict-min>
<flush-strategy>
FailingConnectionOnly
</flush-strategy>
</pool>
<security>
<user-name>
root
</user-name>
<password>

</password>
</security>
<validation>
<validate-on-match>
false
</validate-on-match>
<background-validation>
false
</background-validation>
<useFastFail>
false
</useFastFail>
</validation>
<statement>
<prepared-statement-cache-size>
100
</prepared-statement-cache-size>
<share-prepared-statements/>
</statement>
</datasource>
<datasource jndi-name="java:jboss/datasources/dcframework" pool-name="dcframework_pool" enabled="true" jta="true" use-java-context="true" use-ccm="true">
<connection-url>
jdbc:mysql://localhost:3306/dcframework?zeroDateTimeBehavior=convertToNull
</connection-url>
<driver>
mysqldriver
</driver>
<transaction-isolation>
TRANSACTION_READ_COMMITTED
</transaction-isolation>
<pool>
<min-pool-size>
10
</min-pool-size>
<max-pool-size>
50
</max-pool-size>
<prefill>
true
</prefill>
<use-strict-min>
false
</use-strict-min>
<flush-strategy>
FailingConnectionOnly
</flush-strategy>
</pool>
<security>
<user-name>
root
</user-name>
<password>

</password>
</security>
<validation>
<validate-on-match>
false
</validate-on-match>
<background-validation>
false
</background-validation>
<useFastFail>
false
</useFastFail>
</validation>
<statement>
<prepared-statement-cache-size>
100
</prepared-statement-cache-size>
<share-prepared-statements/>
</statement>
</datasource>
<datasource jndi-name="java:jboss/datasources/dctest1" pool-name="dcframework_pool" enabled="true" jta="true" use-java-context="true" use-ccm="true">
<connection-url>
jdbc:mysql://localhost:3306/dc_testing1?zeroDateTimeBehavior=convertToNull
</connection-url>
<driver>
mysqldriver
</driver>
<transaction-isolation>
TRANSACTION_READ_COMMITTED
</transaction-isolation>
<pool>
<min-pool-size>
10
</min-pool-size>
<max-pool-size>
50
</max-pool-size>
<prefill>
true
</prefill>
<use-strict-min>
false
</use-strict-min>
<flush-strategy>
FailingConnectionOnly
</flush-strategy>
</pool>
<security>
<user-name>
root
</user-name>
<password>

</password>
</security>
<validation>
<validate-on-match>
false
</validate-on-match>
<background-validation>
false
</background-validation>
<useFastFail>
false
</useFastFail>
</validation>
<statement>
<prepared-statement-cache-size>
100
</prepared-statement-cache-size>
<share-prepared-statements/>
</statement>
</datasource>
<datasource jndi-name="java:jboss/datasources/dctest2" pool-name="dcframework_pool" enabled="true" jta="true" use-java-context="true" use-ccm="true">
<connection-url>
jdbc:mysql://localhost:3306/dc_testing2?zeroDateTimeBehavior=convertToNull
</connection-url>
<driver>
mysqldriver
</driver>
<transaction-isolation>
TRANSACTION_READ_COMMITTED
</transaction-isolation>
<pool>
<min-pool-size>
10
</min-pool-size>
<max-pool-size>
50
</max-pool-size>
<prefill>
true
</prefill>
<use-strict-min>
false
</use-strict-min>
<flush-strategy>
FailingConnectionOnly
</flush-strategy>
</pool>
<security>
<user-name>
root
</user-name>
<password>

</password>
</security>
<validation>
<validate-on-match>
false
</validate-on-match>
<background-validation>
false
</background-validation>
<useFastFail>
false
</useFastFail>
</validation>
<statement>
<prepared-statement-cache-size>
100
</prepared-statement-cache-size>
<share-prepared-statements/>
</statement>
</datasource>
<datasource jndi-name="java:jboss/datasources/dctest3" pool-name="dcframework_pool" enabled="true" jta="true" use-java-context="true" use-ccm="true">
<connection-url>
jdbc:mysql://localhost:3306/dc_testing3?zeroDateTimeBehavior=convertToNull
</connection-url>
<driver>
mysqldriver
</driver>
<transaction-isolation>
TRANSACTION_READ_COMMITTED
</transaction-isolation>
<pool>
<min-pool-size>
10
</min-pool-size>
<max-pool-size>
50
</max-pool-size>
<prefill>
true
</prefill>
<use-strict-min>
false
</use-strict-min>
<flush-strategy>
FailingConnectionOnly
</flush-strategy>
</pool>
<security>
<user-name>
root
</user-name>
<password>

</password>
</security>
<validation>
<validate-on-match>
false
</validate-on-match>
<background-validation>
false
</background-validation>
<useFastFail>
false
</useFastFail>
</validation>
<statement>
<prepared-statement-cache-size>
100
</prepared-statement-cache-size>
<share-prepared-statements/>
</statement>
</datasource>
<drivers>
<driver name="h2" module="com.h2database.h2">
<xa-datasource-class>
org.h2.jdbcx.JdbcDataSource
</xa-datasource-class>
</driver>
<driver name="postgresql" module="org.postgresql">
<xa-datasource-class>
org.postgresql.xa.PGXADataSource
</xa-datasource-class>
</driver>
<driver name="mysqldriver" module="com.mysql"/>
</drivers>
</datasources>

我的java程序:

@Stateless
public class DispalyConfigScreenBO {
HashMap<String, Connection> memoryConn = new HashMap<String, Connection>();

@Resource(mappedName = "java:jboss/datasources/dctest1")
DataSource dataSource1;

@Resource(mappedName = "java:jboss/datasources/dctest2")
DataSource dataSource2;

@Resource(mappedName = "java:jboss/datasources/dctest3")
DataSource dataSource3;

public String createPoolConns() {

try {
Connection con1 = dataSource1.getConnection();
memoryConn.put("dctest1", con1);

Connection con2 = dataSource2.getConnection();
memoryConn.put("dctest2", con2);

Connection con3 = dataSource3.getConnection();
memoryConn.put("dctest3", con3);
} catch (Exception e) {
System.out.println("Exception in createPoolConns = " + e);
}
return "success";
}


public String parseColumnnames(String value, String datasource)
throws Exception {
StringBuilder output = new StringBuilder();
Connection conn = null;
Statement st = null;
ResultSet rs = null;
try {

conn = memoryConn.get(datasource);
if (conn == null) {
return null;
} else {

st = conn.createStatement();
rs = st.executeQuery((value + " LIMIT 1").replace(";", ""));
ResultSetMetaData rsMetaData = rs.getMetaData();
int numberOfColumns = rsMetaData.getColumnCount();
for (int i = 1; i <= numberOfColumns; i++) {

if (i == numberOfColumns) {
output.append(rsMetaData.getColumnLabel(i));
} else {
output.append(rsMetaData.getColumnLabel(i));
output.append(",");
}
}
}
} catch (Exception dbException) {
dbException.printStackTrace();
} finally {
if (rs != null) {
rs.close();
}
if (st != null) {
st.close();
}
if (conn != null) {
conn.close();
}
}
return output.toString();
}

我正在创建散列图并将所有连接对象放入该散列图中,并在需要获取连接对象的地方使用该散列图。但除了第一次以外没有用。

帮帮我。

最佳答案

您将在 parseColumnnames 结束时关闭连接 - 所以当您稍后尝试使用它时,它不会工作...您不能使用已关闭的连接。

我建议您不要尝试像这样缓存连接。相反,依靠数据源实现来适本地池化连接,并且每次需要连接时只需调用 getConnection() 即可。 (我还建议使用 try-with-resources 来关闭事物,而不是全部手动完成。)

那样:

  • 您将克服当前的问题
  • 您无需担心处理试图同时使用同一连接的多个线程
  • 您在您的 代码中有一个清晰的连接生命周期,将“我们如何使其高效”推给连接池,其唯一存在的原因就是这样做工作顺利

关于Java.sql.connection 对象第二次不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31065861/

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