java - 尝试锁定表超时;为什么会发生这种情况以及如何解决它?

标签 java database jpa playframework

我在 Play 框架中使用 JPA 一段时间了,一切都很顺利 - 但是,我现在遇到了一个错误,我没有看到任何明显的解决方案。仅就某些背景而言,我试图创建的是一个基本的社交网络。

我有一个帖子类(class):

public class Post extends Model {
private String owner;

private long timestamp;
@ElementCollection
private List<String> viewers;

private String content;

public Post(String owner, List<String> viewers, String content) {
        this.timestamp = System.currentTimeMillis();
        this.owner = owner;
        this.viewers = viewers;
        this.content = content;
        System.out.println("Saving post by " + owner + " with timestamp:" + this.timestamp);
    }
(Getters and setters ignored here)
}

我有一个添加帖子的 User 类:

    public long addPost(String viewers, String content) {
        LinkedList<String> viewersList = new LinkedList(Arrays.asList(viewers.split(",")));
        Post newPost = new Post(this.name, viewersList, content);
        newPost.save();
        return newPost.getTimestamp();
}

我有一个 StreamManager 处理帖子通知和帖子检索。

    public static void executePost(String content, String viewers) {
        System.out.println("Post content: " + content);
        String user = session.get("username");
        User u = User.connect(user);
        if (u == null) {
            System.out.println("User is null");
        }

        /* Add post to local record of posts */
        long timestamp = u.addPost(viewers, content);

        /* Send notification of post to server */
    }

我正在使用 3 个线程的线程池运行我的应用程序,这意味着系统中存在一定量的并发性。当系统在通知后等待服务器的响应时(executePost 结束),另一个线程正在尝试使用以下代码访问新创建的 Post:

    public static void retrievePost(String owner, String timestamp) {
        byte[] postAndKey = new byte[1024];
        byte[] post = null;
        byte[] encryptedKey = null;
        User u = User.connect(owner);
        Post.findAll();
        //List<Post> posts = (Post.find("byOwner", owner).fetch());
        System.out.println("Looking for post by " + owner + " at timestamp: " + timestamp);

        //System.out.println("Looking through: " + posts.size() + " posts");

Post.findAll()处,框架抛出一个严重的错误,告诉我尝试锁定表“POST”时出现超时。我怀疑这是因为一个线程仍在 executePost() 中,而另一个线程正在尝试访问 retrievePost() 中的帖子。然而,考虑到帖子已被“保存”,锁不应该被释放吗?这真的是原因吗?有什么办法可以解决这个错误吗?

谢谢。

最佳答案

仅供引用,如果其他人也遇到类似问题:我通过使用 await() 显式 hibernate 调用线程来修复此问题,这意味着它放弃了所有锁定,允许 retrievePost() 中的线程访问表。

关于java - 尝试锁定表超时;为什么会发生这种情况以及如何解决它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9316343/

相关文章:

java - Java 中的文件加密/解密

java - 如何按项目类型按字母顺序对 java 链接(不是集合 LinkedList)列表进行排序?

sql - 是否可以使用 SELECT 语句分部分获取数据库记录?

java - Hibernate3.5 是否支持 GlassfishV2 上的 JPA1+EJB3.0?

hibernate - JPA @Version行为

java - 激活 Gitlab 以构建项目并运行测试的 .gitlab-ci.yml 文件应该是什么?

java - 使用 MyBatis-Spring 注入(inject)映射器接口(interface)哪种方式更好

database - 自动分析未针对 Postgres 9.2 数据库中的所有表运行

java - Spring JPA、MySQL-无法写入内容: Infinite recursion StackOverflowError through reference chain

Java地理工具: Snap to line identifiying line that was snapped to