相关疑难解决方法(0)

使用DBCP进行Tomcat配置

我们在嘲笑了一段时间(几个小时)后得到了一个CommunicationsException(来自DBCP).错误消息(在Exception中)是在这个问题的结尾 - 但我没有看到在任何配置文件中定义wait_timeout.(我们应该在哪里看?在tomcat/conf目录之外的某个地方?).

其次,正如Exception所建议的那样,在哪里放置"Connector/J连接属性'autoReconnect = true'"?这是tomcat设置文件conf/context.xml中的资源定义:

<Resource name="jdbc/TomcatResourceName" auth="Container" type="javax.sql.DataSource"
           maxActive="100" maxIdle="30" maxWait="10000"
           removeAbandoned="true" removeAbandonedTimeout="60" logAbandoned="true"
           username="xxxx" password="yyyy"
           driverClassName="com.mysql.jdbc.Driver"
           url="jdbc:mysql://127.0.0.1:3306/dbname?autoReconnect=true"/>
Run Code Online (Sandbox Code Playgroud)

第三,为什么JVM会等到executeQuery()调用抛出异常?如果连接超时,getConnection方法应该抛出异常,不应该吗?这是我正在讨论的源代码部分:

        try {
                conn = getConnection (true);
                stmt = conn.createStatement (ResultSet.TYPE_SCROLL_INSENSITIVE,
                                                ResultSet.CONCUR_READ_ONLY);
                rset = stmt.executeQuery (bQuery);
                while (rset.next()) {
                     ....
Run Code Online (Sandbox Code Playgroud)

最后,这里是Stack跟踪的前几行......

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 84,160,724 milliseconds ago.  The last packet sent successfully to the server was 84,160,848 milliseconds ago. is longer than the server configured value of 'wait_timeout'. You should consider either expiring …
Run Code Online (Sandbox Code Playgroud)

java mysql jdbc apache-commons-dbcp

9
推荐指数
1
解决办法
1万
查看次数

最佳JDBC数据源bean类

我看到有些人在使用org.apache.commons.dbcp.BasicDataSource其他配置时会使用com.mchange.v2.c3p0.ComboPooledDataSource.

Spring有自己的: org.springframework.jdbc.datasource.DriverManagerDataSource

可能还有更多.但哪一个最好?我有一个需要连接池的JPA/Hibernate三层应用程序,但看起来所有人都支持这个....

xml configuration datasource class javabeans

8
推荐指数
1
解决办法
4744
查看次数

Arval SQLException:致命:对不起,已经有很多客户已经在postgres

我在PostgreSQL 9.1中使用了一个数据库,其中的条目是从另一个程序不断进入的.我在6秒后从Ajax发送请求以获取最新的entry.tomcat输出窗口显示异常---

Arval SQLException: FATAL: sorry, too many clients already
Run Code Online (Sandbox Code Playgroud)

并且程序在此之后也正常工作.当我用查询检查我的postgres ---

select count(*) from pg_stat_activity;
Run Code Online (Sandbox Code Playgroud)

它显示连接正在不断增加,但我在每次请求后关闭连接.我正在使用netbeans和struts 1.3.

     long previousSNO = Long.parseLong(request.getParameter("previousSNO"));
    if(previousSNO == 0)
    {
        sb.append("SELECT sno,search_type,search_value,search_date FROM log_temp ORDER BY search_date DESC LIMIT 20");
        prest = cb.executeSQLQuery(sb.toString());
        rs = prest.executeQuery();
    }
    else
    {
        sb.append("SELECT sno,search_type,search_value,search_date FROM log_temp WHERE sno > ? ORDER BY search_date DESC");
        prest = cb.executeSQLQuery(sb.toString());    
        prest.setLong(1, previousSNO);
        rs = prest.executeQuery();
    }
    rs.last();
    int c = rs.getRow();
    rs.beforeFirst();

    if(rs!=null && c>0)
    {    
    //code for making json …
Run Code Online (Sandbox Code Playgroud)

java linux postgresql

8
推荐指数
2
解决办法
5万
查看次数

我应该为Spring 3.1.0,Hibernate 4.0.1.Final和MySQL 5.1使用什么池数据源?

我使用的是Spring 3.1.0.RELEASE,Hibernate 4.0.1.Final和MySQL 5.1.我应该使用的汇集数据源是什么?我目前正在使用(来自应用程序上下文文件的代码段)...

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName">
        <value>com.mysql.jdbc.Driver</value>
    </property>
    <property name="url">
        <value>jdbc:mysql://localhost:3306/myproj</value>
    </property>
    <property name="username">
        <value>myproj</value>
    </property>
    <property name="password">
        <value>password</value>
    </property>
</bean>
Run Code Online (Sandbox Code Playgroud)

但这不是池数据源,而是在每次调用时创建JDBC连接.我以前有这个Hibernate配置(hibernate.cfg.xml)...

<hibernate-configuration>
<session-factory>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/myproj</property>
    <property name="hibernate.connection.username">myproj</property>
    <property name="hibernate.connection.password">password</property>
    <property name="hibernate.connection.pool_size">10</property>
    <property name="show_sql">true</property>
    <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
    ...
Run Code Online (Sandbox Code Playgroud)

但是由于Spring 3.1.0中的一个错误,在配置我的会话工厂bean时我不能使用hibernate.cfg.xml文件(我试图这样做 - 来自spring应用程序上下文文件的片段......)

<bean class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" id="sessionFactory">
    <property name="configLocation"> 
        <value>classpath:hibernate.cfg.xml</value> 
    </property>
Run Code Online (Sandbox Code Playgroud)

mysql spring hibernate sessionfactory

6
推荐指数
2
解决办法
6225
查看次数

MySQL在Tomcat中的最佳用法?

哪一个是使用的更好的方法MySQLTomcat:
A)只要它的会话有效分配的用户数据库连接.[OR]
B)打开与DB的连接,每次请求都会到达服务器,当它关闭时.
C)连接池.[最佳答案]

java mysql database tomcat connection-pooling

5
推荐指数
1
解决办法
505
查看次数

SQLException w/Tomcat 7.0 JDBC连接池和MySql

我正在尝试使用新的Tomcat 7.0 JDBC连接池和MySql.它在这里说你可以将最新的tomcat-jdbc.jar放到Tomcat 6.0环境中的tomcat/lib目录中,这就是我所做的.

我正在使用Spring来初始化并实例化Web上的每个示例的DataSource:

<bean id="myDataSource" class="org.apache.tomcat.jdbc.pool.DataSource" destroy-method="close" 
p:driverClassName="${driver_class}"
p:url="${url}"
p:username="${username?root}"
p:password="${password}"
p:initialSize="10"
p:initSQL="SELECT DTS FROM DT_TM_TS FOR READ ONLY WITH UR"
p:minIdle="10"
p:maxIdle="100"
p:maxActive="100"
p:maxWait="6000"
p:jmxEnabled="true"
p:jdbcInterceptors="org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer"
p:removeAbandoned="true"
p:removeAbandonedTimeout="60"
p:logAbandoned="true"
p:testOnBorrow="true"
p:testOnReturn="false"
p:testWhileIdle="false"
p:useEquals="false"
p:fairQueue="false"
p:timeBetweenEvictionRunsMillis="30000"
p:minEvictableIdleTimeMillis="30000"
p:validationInterval="1800000"
p:validationQuery="SELECT DTS FROM DT_TM_TS FOR READ ONLY WITH UR"
/>   
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试连接到数据库时,它会抛出此异常:

java.sql.SQLException: "com.mysql.jdbc.Driver"
    at org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:243)
    at org.apache.tomcat.jdbc.pool.PooledConnection.connect(PooledConnection.java:176)
    at org.apache.tomcat.jdbc.pool.ConnectionPool.createConnection(ConnectionPool.java:647)
    at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:589)
    at org.apache.tomcat.jdbc.pool.ConnectionPool.init(ConnectionPool.java:452)
    at org.apache.tomcat.jdbc.pool.ConnectionPool.<init>(ConnectionPool.java:130)
    at org.apache.tomcat.jdbc.pool.DataSourceProxy.createPool(DataSourceProxy.java:99)
    at org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:110)
    at org.hibernate.ejb.connection.InjectedDataSourceConnectionProvider.getConnection(InjectedDataSourceConnectionProvider.java:46)
    at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:111)
    at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2101)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1325)
    at …
Run Code Online (Sandbox Code Playgroud)

java mysql tomcat connection-pooling jdbc

5
推荐指数
2
解决办法
9146
查看次数

DBCP返回已关闭的连接

我们看到我们的数据库连接因org.apache.commons.dbcp.BasicDataSource插槽写入错误而死的情况:

com.microsoft.sqlserver.jdbc.SQLServerException: Connection reset by peer: socket write error
Run Code Online (Sandbox Code Playgroud)

当然,所有后续写入连接的尝试都会失败:

com.microsoft.sqlserver.jdbc.SQLServerException: The connection is closed.
Run Code Online (Sandbox Code Playgroud)

更新代码以捕获此类异常并在发生新连接时请求它,它再次失败.我是否正确怀疑DataSource#getConnection()每次呼叫时呼叫实际上并没有提供新的连接?是不是只是重用现有的连接,这是关闭的?

如果我是正确的,什么是丢弃旧连接并请求新连接的正确方法?

编辑:这是我想知道的更简洁的版本:

Connection c1, c2;
c1 = DatabaseManager.getConnection();
// c1.close() not called
c2 = DatabaseManager.getConnection(); 
Run Code Online (Sandbox Code Playgroud)

"c1 == c2"是真实的陈述吗?或者分配了两个连接?如果是后者,那么像这样的代码表示"连接池泄漏":

Connection c1;
c1 = DatabaseManager.getConnection();
// c1.close() not called
c1 = DatabaseManager.getConnection();
Run Code Online (Sandbox Code Playgroud)

java jdbc apache-commons-dbcp

5
推荐指数
1
解决办法
2万
查看次数

每次调用query()时JdbcTemplate都会创建一个新连接吗?

在下面的示例中,JdbcTemplate是创建两个连接还是一个?

public class MyDao {

     private JdbcTemplate jdbcTemplate;

     public List<Data1> getData1() {
          return jdbcTemplate.query(mySql, myParams, myCallback);
     }

     public List<Data2> getData2() {
          jdbcTemplate.query(mySql2, myParams2, myCallback2);
     }
}

public class Main {
    public static void main(String[] args) {
         MyDao dao = new MyDao();
         List<Data1> d1 = dao.getData1();
         List<Data2> d2 = dao.getData2();
         doStuff(d1, d2);
    }
}
Run Code Online (Sandbox Code Playgroud)

也就是说,它是否重用第一个查询中的连接?我们假设它是使用基本数据源(不是池数据源)构建的.

java mysql

5
推荐指数
1
解决办法
4525
查看次数

IS ResultSet线程安全

ResultSet线程安全吗?

我的问题出现了,因为在我的程序中,我已经为每个查询使用了不同的语句,我已经将ResultSet声明为局部变量,但是在ResultSet关闭后,它给出了一个不允许的操作错误.但我的语句正在工作,因为我正在使用插入和删除查询中的语句.我已经评论了ResultSet部分,并没有得到错误!

java multithreading jdbc

3
推荐指数
2
解决办法
5972
查看次数

使用tomcat的连接池和JPA

我想在我运行在tomcat.Earlier上的web应用程序中使用带JPA/TopLink的连接池我使用jdbc的Connection和Statement类来操作数据库中的数据; 以这种方式使用连接池我只需在context.xml中声明资源并在应用程序中获取此资源:

Context c = new InitialContext();
DataSource source = (DataSource) ((Context)c.lookup("java:comp/env")).lookup("jdbc/MySource");
Run Code Online (Sandbox Code Playgroud)

现在我想用JPA这样的连接池.我怎样才能做到这一点?

还有一个问题:我在一些例子中看到reosurce在context.xml中声明,然后在<resource-ref>中的web.xml中声明.为什么我应该在不同的地方声明它或者它是相同的声明,我的意思是它相当于context.xml中的声明?

tomcat jpa

3
推荐指数
1
解决办法
6507
查看次数