2013-03-04 51 views
0

我正在使用MySQL开发我的第一个Java项目。每次从数据源获取数据时,都会调用一个函数。这个函数应该保存一个新行到我的MySQL数据库。看到这里的代码:如何在java中保持连接活着

import java.sql.*; 
import java.util.Properties; 

/** 
* 
* @author jeffery 
*/ 
public class SaveToMysql { 
    // The JDBC Connector Class. 
    private static final String dbClassName = "com.mysql.jdbc.Driver"; 

    private static final String CONNECTION = "jdbc:mysql://localhost/test"; 

    static public String test(int reqId, String date, double open, double high, double low, 
             double close, int volume, int count, double WAP, boolean hasGaps){ 

     if (date.contains("finished")){ 
      return "finished"; 
     } 


     // Class.forName(xxx) loads the jdbc classes and 
     // creates a drivermanager class factory 
     try{ 
      Class.forName(dbClassName); 
     }catch (ClassNotFoundException e) { 
      System.out.println(e); 
     } 

     // Properties for user and password. Here the user and password are both 'paulr' 
     Properties p = new Properties(); 
     p.put("user","XXXXXXXX"); 
     p.put("password","XXXXXXXXXXXx"); 

     // Now try to connect 
     Connection conn; 
     try{ 
      conn = DriverManager.getConnection(CONNECTION,p); 
     }catch(SQLException e){ 
      return e.toString(); 
     } 

     PreparedStatement stmt; 
     try{ 
      stmt = conn.prepareStatement("insert into dj_minute_data set symbol = (select ticker from dow_jones_constituents where id = ?), " 
        + "date = str_to_date(?,'%Y%m%d %H:%i:%s')" + 
      ", open = ?" + 
      ", high = ?" + 
      ", low = ?" + 
      ", close = ?" + 
      ", volume = ?" + 
      ", adj_close = ?"); 
      stmt.setInt(1, reqId); 
      stmt.setString(2, date); 
      stmt.setDouble(3, open); 
      stmt.setDouble(4, high); 
      stmt.setDouble(5, low); 
      stmt.setDouble(6, close); 
      stmt.setDouble(7, volume); 
      stmt.setDouble(8, WAP); 
     }catch (SQLException e){ 
      return e.toString(); 
     } 

     try{ 
      stmt.executeUpdate(); 
     }catch (SQLException e){ 
      return e.toString(); 
     } 

     return stmt.toString(); 
    } 

} 

大家都可以看到这个功能test是在自己的班级,称为SaveToMysql。要调用此函数,我将该类导入到不同的类中,并使用以下语法:

msg = SaveToMysql.test(reqId, date, open, high, low, close, volume, count, WAP, hasGaps); 

msg然后获取输出到屏幕。显示错误消息或成功。

该功能可以在短时间内快速调用多次。我知道每次调用函数时都不应该重新打开与MySQL服务器的连接。我将如何改变这一点,以便每次调用该函数时,MySQL连接都保持打开状态。

谢谢!

回答

1

您需要管理一个静态类或方法。

public class ConnectionClass 
{ 
    public static Connection connection = null; 

    public Connection getCurrentConnection() 
    { 
     if(connection != null) 
     { 
      return connection; 
     } 
     else 
     { 
      create new connection... 
        and return that new connection after giving it to global connection.. 
     } 
    } 
} 
每次

这个你会得到当前连接。如果有问题并且连接不可用,则可以创建新的连接。当你需要连接对象时,你只需要调用getCurrentConnection方法。

所以你只需要在你的代码中进行以下操作。

Connection conn; 
try{ 
    //conn = DriverManager.getConnection(CONNECTION,p); 
     conn = getCurrentConnection(); 
}catch(SQLException e){ 
    return e.toString(); 
} 
+0

就像SingleTone设计模式。 – KSHiTiJ 2013-03-04 08:50:49

+0

仍在建设中... – 2013-03-04 11:36:59

+0

意味着连接?是指每次调用该方法建立新的连接?如果是,那么给你的代码。 – KSHiTiJ 2013-03-04 11:52:25

2

我知道我不应该在每次调用函数时重新打开与MySQL服务器的连接。

不,它的罚款这样做 - 只要你有在引擎盖下的连接池管理真正连接。有各种连接池项目,如c3p0DBCP。这样,你可以让您的每一个电话从相互隔离的:

  • 取从池中的连接
  • 使用它
  • 其释放回池中

见文档无论您选择哪个泳池作为细节。通常,连接池允许您像往常一样从JDBC请求连接,然后按正常方式关闭它,从而有效地使整个事情变得透明。

另请注意,您应该肯定开始使用带有参数的预准备语句,而不是直接在您的SQL语句中包含您的值。您当前的代码是等待发生的SQL injection attack

+0

感谢抬头有关安全,我会更新我的问题,以便不给别人如何做这个错误的想法。 – 2013-03-04 08:01:24

0

如果你想使用1个连接时调用SaveToMysql.test方法很多次,你可以添加方法参数的连接,或创建一个全局变量连接出方SaveToMysql.test方法。但是,如果您使用1个连接,请注意事务。我希望它能帮助你。

2

JDBC URL:jdbc:mysql://:/? connectTimeout = 0 &了socketTimeout = 0 & autoReconnect的=真