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 数据库

如果 SQLite 游标没有结果,应用程序崩溃