我有一个要连接到MySQL数据库的应用程序。它在半夜断开连接,然后喷出有关null
连接的信息,并且JDBC在X秒内没有收到消息。
getConnection()
在进行任何需要与SQL Server通信的操作之前,我先打电话给我。
这是我的getConnection()
方法:
private Connection getConnection() {
try {
if (connection != null) {
if (connection.isClosed() || !connection.isValid(10000)) {
this.initializeRamsesConnection();
}
} else {
this.initializeRamsesConnection();
}
} catch (Exception e) {
debug("Connection failed: " + e);
}
return connection;
}
在该initializeRamsesConnection()
方法中,我将密码等信息放入字符串中,然后以标准JDBC方式创建连接。
然后我调用此方法:
private Connection getConnectionFromConnectionString() {
Connection con = null;
String driver = "com.mysql.jdbc.Driver";
try {
Class.forName(driver);//jdbc sorcery
//if there is no connection string
if (getConnectionString() == null) {
HMIDatabaseAdapter.debug("No connection string");
}
//makes a string out of the values of db/host
String str = getConnectionString();
//if there is no driver
if (driver == null) {
debug("" + ": " + "No driver");
}
//Tries to make a connection from the connection string, username, and the password.
con = DriverManager.getConnection(str, username, password);
//if for some reason the connection is null
if (con == null) {
HMIDatabaseAdapter.debug("CONNECTION IS NULL, WHAT?");
}
} catch (Exception ex) {
HMIDatabaseAdapter.debug("getConnection() " + ex);
}
return con;
}
我可以对这两种方法进行哪些更改以适应丢失的连接?
这不是检索连接的正确方法。您正在检索连接并将其分配为该类的实例变量(或更糟糕的是,静态变量)。基本上,您将使连接永远保持打开状态,并对所有查询重新使用单个连接。如果查询由不同的线程执行,则可能会导致灾难。另外,当它保持打开状态太长时间时,DB会回收它,因为它假定它已死/泄漏。
您应该在 尽可能短的范围内 获取 并关闭 连接。即与执行查询的位置相同。像这样: __try
public Entity find(Long id) throws SQLException {
Entity entity = null;
try (
Connection connection = dataSource.getConnection(); // This should return a NEW connection!
PreparedStatement statement = connection.prepareStatement(SQL_FIND);
) {
statement.setLong(1, id);
try (ResultSet resultSet = preparedStatement.executeQuery()) {
if (resultSet.next()) {
entity = new Entity(
resultSet.getLong("id"),
resultSet.getString("name"),
resultSet.getInt("value")
);
}
}
}
return entity;
}
如果您担心连接性能并想重用连接,则应该使用连接池。您可以自己种一个,但是我强烈不建议这样做,因为您似乎还很陌生。只需使用现有的连接池,例如BoneCP,C3P0或DBCP即可。请注意,您应该
不会 如在上面的例子改变JDBC成语。您仍然需要在尽可能短的范围内获取并关闭连接。连接池本身将担心实际重用,测试和/或关闭连接。
问题内容: 我想使用Java 7和NIO 2编写异步服务器。 但是我应该怎么用呢? 例如,如果我开始: 然后,当我这样做时,该程序 终止, 因为该调用是 异步的 。如果我将该代码置于无限循环中,则会抛出。 关于如何使用编写一个简单的异步服务器的任何建议? 这是我的完整示例(类似于JavaDoc中的示例): 问题答案: 您走在正确的轨道上,从完成的回调中调用accept()以便接受更多连接应该起作用
我试图创建一个简单的SpringBoot应用程序来连接和存储数据库中的一些数据,但是当我的代码试图提交一个新对象时,仍然会遇到401禁止消息。 我应该如何使用SpringBoot连接到ArangoDb,以便能够在数据库中保存节点? 我的系统上运行了ArangoDb,我可以在localhost登录到web控制台:http://localhost:8529 我有一个与下面的属性同名的数据库。我还尝试在
我的问题是,我已经创建了一个传输控制协议,当它停留没有传输任何数据约1小时,它已经从服务器断开连接,但它不通知我,它已断开连接,我应该发送保持活动的数据包到服务器吗?或者我应该发送保持活动的数据包从服务器到客户端?或者我应该发送两个?
我有一个活动,它为结果启动了一些其他活动,所以当结果回来时,该活动可能已经或可能没有被销毁和重新创建。 我已经重写了onSaveInstanceState,以便添加需要保留和恢复的数据。 当活动被销毁并重新创建时,onCreate被传递给savedInstanceState包;但也调用并传递了相同的捆绑包onRestoreInstanceState()。 那么我应该把从捆绑包中提取数据并恢复状态的
我使用的是Netty 4.0.33-Final中的LengthFieldBasedFrameDecoder类。 我正在开发的软件可以在没有Netty的帮助下与电视通信,所以我在这里以非传统的方式使用Netty。我只是使用Netty作为解码器和通道管道来解码来自各种不同设备的消息。那至少是我的目标。 问题是LengthFieldBasedFrameDecoder将长度字段解释为十六进制值0x38,并
在一个android应用中,我编写了一个在后台播放音乐的服务。我已经实现了来监听音频焦点的更改。问题是,在以下情况下,我没有收到对的回调。 > 在我的应用程序中播放音乐,并将应用程序放在后台。(背景不断播放音乐)。 启动youtube应用程序,播放任何视频。这将回调,在此我暂停媒体播放器。 现在我为youtube按home键(youtube停止播放)。