我对MySQL和JAVA Web应用程序有疑问。我已经在mysql中创建了存储过程sp_doWriteLogTrans,它与我的tomcat很好地配合。

但是,当tomcat服务器空闲一段时间(无任何请求)(1天),之后我提出了一个新请求

到JAVA Web应用程序,它总是显示这样的错误。

Jan 28, 2016 9:24:09 AM com.sun.xml.ws.server.sei.TieHandler createResponse
SEVERE: FUNCTION sp_doWriteLogTrans does not exist
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: FUNCTION sp_doWriteLogTrans does not exist
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:422)


我不知道为什么会发生这种异常。但是当我重启tomcat时。重新恢复正常工作。

这是我与mysql通信的Java代码

MySQLDB mydb = new MySQLDB();
        mydb.connect();
        String sql = "{call sp_doWriteLogTrans(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)}";
        CallableStatement call  = mydb.conn.prepareCall(sql);
        call.setString(1, type);
        call.setString(2, value1);
        call.setString(3, value2);
        call.setString(4, value3);
        call.setString(5, value4);
        call.setString(6, value5);
        call.setString(7, value6);
        call.setString(8, value7);
        call.setString(9, value8);
        call.setString(10, value9);
        call.setString(11, value10);
        call.setString(12, value11);
        call.setString(13, value12);
        call.setString(14, value13);
        call.setString(15, value14);
        call.setString(16, value15);
        call.setString(17, value16);
        call.setString(18, value17);
        call.setString(19, logno_ref);
        call.setString(20, command);
        call.registerOutParameter(21, Types.INTEGER);
        call.execute();
        String logno = call.getString(21);

        mydb.disconnect();


这是MySQLDB类的connect方法

public boolean connect() {


             // Get a context for the JNDI look up
            Context ctx;
            try {
                ctx = new InitialContext();
                Context envContext = (Context) ctx.lookup("java:/comp/env");
                javax.sql.DataSource ds = (javax.sql.DataSource) envContext.lookup ("jdbc/mysql");

                conn = ds.getConnection();
            } catch (NamingException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return true;

        }


我还配置了tomcat以使用这样的连接池

在conf / context.xml中

   <Resource url="jdbc:mysql://99.99.99.99:3306/xxx_db?useUnicode=true&characterEncoding=UTF-8&useOldAliasMetadataBehavior=true&autoReconnect=true"
password="passs123" description="My conection pool" type="javax.sql.DataSource" factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
auth="Container" name="jdbc/mysql" defaultAutoCommit="true" removeAbandoned="true" removeAbandonedTimeout="300"
maxWaitMillis="10000" maxIdle="100" maxTotal="500" driverClassName="com.mysql.jdbc.Driver" username="user1"/>


如何使我的应用程序保持工作状态而无需每天重启?

最好的祝福,

最佳答案

最后,我找到了解决方案。我必须进行往返以保持所有连接实例处于活动状态。可以通过在conf / context.xml中配置数据源来完成,方法是添加简单的SQL“选择1”作为测试属性。

10-01 09:48
查看更多