我正在使用MySQL开发我的第一个Java项目。每次从数据源获取数据时,我都会调用一个函数。此函数应该为MySQL数据库保存一个新行。请参阅此处的代码:
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服务器的连接。如何更改此设置,以便每次调用函数时,1个MySQL连接都保持打开状态。
谢谢!
答案 0 :(得分:3)
JDBC URL:jdbc:mysql://:/? connectTimeout = 0& socketTimeout = 0& autoReconnect = true
答案 1 :(得分:2)
我知道每次调用函数时我都不必重新打开与MySQL服务器的连接。
不,这样做很好 - 只要你有一个连接池来管理真正的连接。周围有各种连接池项目,例如c3p0和DBCP。通过这种方式,您可以将每个呼叫与其他呼叫隔离开来:
有关详细信息,请参阅您选择的任何池的文档。连接池通常允许您像往常一样从JDBC请求连接,然后正常关闭它,有效地使整个事物透明。
另请注意,您应该肯定开始使用带参数的预准备语句,而不是直接在SQL语句中包含您的值。您当前的代码是等待发生的SQL injection attack。
答案 2 :(得分: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();
}
答案 3 :(得分:0)
如果要在多次调用SaveToMysql.test方法时使用1连接,可以在方法参数中添加连接,或者在SaveToMysql.test方法外创建全局连接变量。但是,如果您使用1连接,请关注交易。我希望它会对你有所帮助。