首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java.sql.connection对象第二次不工作

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

Stack Overflow用户
提问于 2015-06-26 13:53:01
回答 1查看 563关注 0票数 1

我在我的程序中为jboss应用服务器声明了Resource注解。我正在使用这些注释创建连接对象。当我第一次使用connection时,它会建立连接,并且通过使用java.sql.ResultSetMetaData,我能够获得值。但在第二次遇到异常时,我发现"java.sql.SQLException: Connection is not associated with a managed connection.org.jboss.jca.adapters.jdbc.jdk6.WrappedConnectionJDK6@19adb".为什么我会得到这个异常。

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

standalone.xml:

代码语言:javascript
复制
<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程序:

代码语言:javascript
复制
@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();
    }

我正在创建hashmap,并将所有连接对象放在该hashmap中,并在任何需要获取连接对象的地方使用该hashmap。但除非是第一次,否则不能工作。

帮帮我。

EN

回答 1

Stack Overflow用户

发布于 2015-06-26 13:57:03

您在parseColumnnames的末尾关闭了连接-所以当您稍后尝试使用它时,它将不起作用……您不能使用关闭的连接。

我建议你不要尝试像这样缓存连接。取而代之的是,依靠数据源实现来适当地汇集连接,并在每次需要连接时调用getConnection()。(我还建议使用try-with-resources来关闭所有内容,而不是全部手动完成。)

这样的话:

  • 您将克服当前的问题
  • 您无需担心同时处理尝试使用同一连接的多个线程
  • 您的代码中有一个清晰的连接生命周期,将“我们如何使其高效”这句话抛给连接池,而连接池存在的唯一原因就是做好这项工作
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31065861

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档