Тайм-аут при попытке блокировки таблицы;почему это происходит и как мне это исправить? - PullRequest
1 голос
/ 16 февраля 2012

Я уже некоторое время использую JPA в Play Framework, и все шло хорошо - однако сейчас я столкнулся с ошибкой, для которой я не вижу никаких очевидных решений.Просто для некоторого контекста я пытаюсь создать простую социальную сеть.

У меня есть класс Post:

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), другой поток пытается получить доступ к вновь созданному сообщению, используя этот код:

    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() платформа выдаетнеприятная ошибка, говорящая, что есть Timeout trying to lock table "POST".Я подозреваю, что это потому, что один поток все еще находится в executePost(), в то время как другой пытается получить доступ к сообщению в retrievePost().Однако, учитывая, что сообщение было «сохранено», разве блокировка не должна быть снята?Это действительно причина, и есть ли способ обойти ошибку?

Спасибо.

1 Ответ

1 голос
/ 18 февраля 2012

Просто для справки, если у кого-то еще возникла подобная проблема: я исправил ее, явно спя вызывающий поток, используя await(), что означало, что он отказался от всех своих блокировок, позволив потоку в retrievePost() получить доступ таблица.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...