Chr*_*ess 5 java mysql jdbc apache-storm
大家好,我有一个基本的Storm应用程序设置,它接收一个推文流并将它们存储在MySQL数据库中.该应用程序在前约23小时左右运行良好,然后开始出现以下错误:
SQL Exception
SQL State: 08003
Run Code Online (Sandbox Code Playgroud)
它做了几次就死了.我正在使用标准JBDC连接器从Java连接到数据库.存储和设置DB连接的功能代码如下:
private String _db="";
private Connection conn = null;
private PreparedStatement pst = null;
public ArchiveBolt(String db){
_db = db;
}
private void setupConnection() {
//Connect to the database
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:8889/twitter_recording", "root", "root");
} catch (Exception e){
e.printStackTrace();
}
}
public void execute(Tuple tuple, BasicOutputCollector collector) {
Status s = (Status) tuple.getValue(0);
//setup the connection on the first run through or if the connection got closed down
try {
setupConnection();
} catch (Exception e) {
// TODO: handle exception
System.out.println(e.toString());
}
try {
pst = conn.prepareStatement("INSERT INTO " + _db + " (tweet)" +
"VALUES (?);");
pst.setString(1, s.toString());
//execute the SQL
pst.executeUpdate();
} catch (SQLException ex) {
// handle any errors
System.out.println("SQLException: " + ex.getMessage());
System.out.println("SQLState: " + ex.getSQLState());
System.out.println("VendorError: " + ex.getErrorCode());
if(ex.getSQLState().equals("08003")){
setupConnection();
}
} finally {
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud)
在显然它因为08003错误而崩溃之后我决定如果它抛出该错误它应该重试连接的设置,但是这也没有帮助.有人能指出我正确的方向来解决这个问题吗?
在发现它因 08003 错误而崩溃后,我决定如果抛出该错误,则应该重试连接的设置,但这也没有帮助。谁能指出我解决这个问题的正确方向?
这里基本上有两个问题需要解决:
对于第一个问题,您应该查看MySQL日志,看看是否有任何迹象。另外,检查紧邻(重复的)“state 080003”异常之前的 SQL 异常。后者只是告诉您连接之前已断开。
我的猜测是问题是以下之一:
MySQL 服务器由于不活动而导致连接超时。如果这是问题,您可以更改 MySQL 配置中的连接超时。
您的应用程序可能会慢慢泄漏 JDBC 连接。
对于第二个问题,一般方法是正确的,但您的代码与描述不符。事实上,每次调用您的方法时,它看起来总是试图建立一个新的数据库连接。execute这使得异常处理程序中的重新连接调用毫无意义。(OTOH,代码显示有人一直在“殴打它”以试图让它工作......这很可能是问题的一部分。)
我会检查是否在需要时setupConnection被调用,并查找可能引发的任何异常。此外,您应该确保明确地死连接对象......并重新思考/重新编码您的连接管理,以便它不会泄漏。close()
根据记录,有一个名为“autoReconnect”的连接 URL 参数,在遥远的过去用于“处理”丢失的连接。不幸的是,最初的实现是不安全的,因此他们实际上禁用了它;有关详细信息,请参阅此问题:为什么 autoReconnect=true 似乎不起作用?
| 归档时间: |
|
| 查看次数: |
344 次 |
| 最近记录: |