Java应用程序中的SQLite崩溃(在线游戏)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java应用程序中的SQLite崩溃(在线游戏)相关的知识,希望对你有一定的参考价值。
我正在为在线游戏写一个插件。它在MS Server 2012上运行。该插件通过扩展开发人员API提供的@EventMethods来工作,我的插件使用SQLite数据库来存储与游戏“块”(环境中的3D空间)相关的玩家信息。
在我的测试服务器上一切都很好,但我只有自己和另一个用户测试它。
当我将插件部署到主服务器并且人们开始加入(大约12个用户)时,服务器在大约十分钟后崩溃,并出现“Java运行时环境已检测到致命错误:EXCEPTION_ACCESS_VIOLATION”
现在我认为这是由SQLite崩溃引起的。
以下是我访问SQLite数据库的方法之一的示例。
@EventMethod
public void onPlayerPlaceObject(PlayerPlaceObjectEvent event) throws SQLException {
int blockXChunk = event.getChunkPositionX();
int blockYChunk = event.getChunkPositionY();
int blockZChunk = event.getChunkPositionZ();
String blockChunkID = "" + blockXChunk + blockYChunk + blockZChunk;
try {
//get the playerUID and the blockchunkID
ResultSet rs = database.executeQuery("SELECT * FROM `Areas` WHERE `PlayerUID` = '" + event.getPlayer().getUID() + "' AND `AreaID` = '" + blockChunkID + "'");
if (rs.next() ) {
//player owns chunk do whatever you like!
rs.close();
return;
} rs.close();
//lets see if the blockChunk event is happening somewhere where someone own ths AreaID
rs = database.executeQuery("SELECT * FROM `Areas` WHERE `AreaID` = '" + blockChunkID + "'" );
if (rs.next() ) {
//chunk is owned by someone and its not the one making the event.
String string = (String)rs.getString("PlayerUID");
rs.close();
rs = database.executeQuery("SELECT * FROM `Friends` WHERE `OwnerUID` = '" + string + "' AND `FriendUID` = '" + event.getPlayer().getUID() + "'" );
if (rs.next() ) {
//player is a friend of the owner do whatever you like!
rs.close();
return;
} rs.close();
event.setCancelled(true);
return;
} else { rs.close(); }
} catch ( Exception e ){ System.out.println(); }
}
我怀疑这些方法经常在SQLite数据库上调用,导致它崩溃。有人可以帮我找一个更安全的方式来访问这些数据吗?或者我会更好地使用像mysql这样的“适当”数据库,并且是否有适当的结构来阻止EXCEPTION_ACCESS_VIOLATION?
编辑:我已经删除了前面代码中重用的ResultSet对象(命名对象rs,rs2,rs3等),但Java Runtime Environment仍然以明显随机的方式使用EXCEPTION_ACCESS_VIOLATION崩溃(我在整个代码中添加了println语句)希望追踪事故发生的地方 - 但确实是随机出现的。有时服务器将运行10分钟并崩溃,有时它将运行24小时左右然后崩溃。我还在try-with-resources块中包含了所有ResultSet。结果相同。
不要将ResultSet对象rs重用于多个查询,为每个查询创建一个新实例以避免出现问题。
以上是关于Java应用程序中的SQLite崩溃(在线游戏)的主要内容,如果未能解决你的问题,请参考以下文章
在 Android 中写入 SQLite 数据库时应用程序崩溃 [重复]
SQLite 查询错误,onItemClick 导致应用崩溃
Sqlite 内容提供程序:插入行,但应用程序崩溃无法插入行
将用户输入编辑文本与SQLite数据库Android Java进行比较
使用无效 URL 调用 addPersistentStoreWithType 时崩溃 - 路径中的文件似乎不是 SQLite 数据库