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

标签 java jdbc jboss

我已经在我的程序中为 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/

相关文章:

java - 如何增加Wildfly中的最大连接数、流和线程数?

java - 在 JBoss 6.2.3 GA 域模式下,您在哪里可以找到部署的文件?

java - 如何移动 Eclipse RCP 项目 .pref 文件

java - sendMessage() 方法在哪里找?

java - 通过 Java 将超大数据集加载到关系数据库的最佳实践

java - 具有主/备份数据库的单个 JDBC OracleDataSource/HikariCP

java - H2数据库自动递增id在第一次输入后具有随机值

jboss - org.jboss.remoting3.ProtocolException : Too many channels open. 如何增加 channel

java - Micronaut RxHttpClient null

java - CardView背景颜色变化