Архивы: java

Google App Engine и индексы

В случае, если при запросе у вас используется несколько условий, то GAE требует наличия индексов, другими словами, вот такой вот запрос отработает без индексов:

1
SELECT * FROM HyperLink WHERE param1 == 1

А вот такой потребует создания индекса:

1
SELECT * FROM HyperLink WHERE param1 == 1 && param2 == 2

Если вы программируете на Java, то, при локальной разработке, как только сервер выполнит запрос и обнаружит в нём два условия, то сгенерирует xml файл datastore-indexes-auto.xml примерно такого содержания:

1
2
3
4
5
6
7
8
9
10
<!-- Indices written at Sat, 8 Jan 2011 11:58:41 UTC -->

<datastore-indexes>

    <!-- Used 2 times in query history -->
    <datastore-index source="auto" ancestor="true" kind="HyperLink">
        <property direction="asc" name="param2"></property>
    </datastore-index>

</datastore-indexes>

Локально всё будет работать, но после deployment — com.google.appengine.api.datastore.DatastoreNeedIndexException. WTF!?

Оказывается, надо дописать в этот файл параметр autoGenerate=»true». Вот так:

1
2
3
4
5
6
7
8
9
10
<!-- Indices written at Sat, 8 Jan 2011 11:58:41 UTC -->

<datastore-indexes autogenerate="true">

    <!-- Used 2 times in query history -->
    <datastore-index source="auto" ancestor="true" kind="HyperLink">
        <property direction="asc" name="param2"></property>
    </datastore-index>

</datastore-indexes>

Попробуйте обратить на это внимание при первом прочтении документации. Даже при втором.

GAE и Java

Google App Engine и Java это вообще ад и погибель. Тогда как с питоном работать просто и удобно, здесь как по граблям идёшь. Постоянно какие-то глюки, которые или не документированы, или важная информация засунута настолько глубоко, что ищется только после получаса настойчивого гугления.

Поэтому, если у вас будет выбор на чём начинать проект для GAE. Не берите Java.

Google App Engine и хранение объектов в сессии

В GAE бывает довольно удобно хранить объекты в текущей сессии пользователя. Например, некоторый класс, который отвечает за параметры текущего пользователя. Пусть он называется Account.

1
2
3
4
5
6
7
8
9
10
@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class Account {
    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Key key;

    @Persistent private String email;
   
    // Здесь ещё всякие поля и методы.
}

Всё работает замечательно, до тех пор пока вы не сделаете deploy. Тут всё чудесным образом начнёт отваливаться с java.lang.RuntimeException: java.io.NotSerializableException

Хотя, казалось бы, а чего оно работает тогда локально. Ну да ладно. Решение простое. Надо сделать классу implements Serializable, т.е. получится что-то такое.

1
2
3
4
5
6
7
8
9
10
@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class Account implements Serializable {
    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Key key;

    @Persistent private String email;
   
    // Здесь ещё всякие поля и методы.
}

Такие дела.

Джеймс Гослинг: сессия "чекаво"

Джеймс Гослинг провел сессию вопросов-ответов в Гугле на общие темы (в стиле «чего, как оно вообще»?). Я сходил — интересно было послушать умного опытного человека. Сделал отрывочные заметки на бумажке.

Вот здесь вот полный вариант. Ещё и видео есть. Советую. Джеймс Гослинг — отец Java, если кто не в курсе.