2013-09-24 4 views
1

Проблема заключается в том, что после запуска сервера через TCP и создания функции псевдонима SLIDEWINDOW для таймфрейма класса я называю псевдоним slidewindow. Но изнутри этой функции я должен запросить таблицу (любую таблицу), чтобы получить необходимую информацию. Когда я снова подключаюсь, сервер и приложение зависают.H2 Функция базы данных Псевдоним доступа к другой функции

КОД:

public class TimeFrame { 
public static void main(String... args) throws Exception { 
    Class.forName("org.h2.Driver"); 
    Connection conn = DriverManager.getConnection("jdbc:h2:tcp://MYIP:9092/~/test", "sa", ""); 
    Statement stat = conn.createStatement(); 

    //Setup Table 
    stat.execute("DROP TABLE IF EXISTS timeframe"); 
    stat.execute("CREATE TABLE timeframe (last_updated TIMESTAMP, ip int"); 
    stat.execute("CREATE ALIAS IF NOT EXISTS SLIDEWINDOW FOR \"h2TimeFrame.TimeFrame.slidewindow\" "); 
} 
} 

Что делать, если я хочу, чтобы получить доступ к чтению таблицы из функции SLIDEWINDOW?

public static void slideWindow(String ip){ 
    ... 
    Connection conn = DriverManager.getConnection ("jdbc:h2:tcp://MYIP:9092/~/test", "sa", ""); 
    Statement stat = conn.createStatement(); 
    res = stat.executeQuery("SELECT * FROM timeframe where ip = '" + ips + "' limit 1 "); 
    ... 
} 

Q1. Могу ли я сделать это из псевдонима?

Q2. Приложение зависает, когда я вызываю псевдоним «SELECT SLIDEWINDOW (« 127.0.0.1 »)« либо с веб-консоли сервера H2, либо из приложения java?

ответ

1

Как выяснилось. Для псевдонима первый аргумент функции java может быть «Connection», который передаст обработчик установленному соединению.

Q1. Могу ли я сделать это из псевдонима?

Я не должен устанавливать соединение снова с базой данных из Alias.

Q2. Приложение зависает, когда я вызываю псевдоним «SELECT SLIDEWINDOW (« 127.0.0.1 »)« либо с веб-консоли сервера H2, либо из приложения java?

Я решил это, передав «Соединение» в качестве первого аргумента и отдыха, как и прежде. как

public static void slideWindow(Connection conn, String ip){ 
... 
//Connection conn = DriverManager.getConnection ("jdbc:h2:tcp://MYIP:9092/~/test", "sa", ""); 
Statement stat = conn.createStatement(); 
res = stat.executeQuery("SELECT * FROM timeframe where ip = '" + ips + "' limit 1 "); 
... 

}

+1

Другим решением является использование специального JDBC URL 'JDBC: По умолчанию: connection' внутри функции, а это означает' Соединение Conn = DriverManager.getConnection ("JDBC: по умолчанию: соединение"); ' –

+0

@ThomasMueller благодарит – Saad

Смежные вопросы