1

以下は、VoltDB サーバーに接続する方法を示す簡単なコード スニペットです。

ClientConfig clientConfig = new ClientConfig();
Client client = ClientFactory.createClient(clientConfig);
String server = "192.168.43.32";
client.createConnection(server);

私の実験に基づいて、サーバーがダウンしているか、ネットワーク層から接続できない場合、応答を取得するのに約 75 秒かかります。

SEVERE: Failed to connect to 192.168.43.32, in 75,359 ms
java.net.ConnectException: Operation timed out
    at sun.nio.ch.Net.connect0(Native Method)
    at sun.nio.ch.Net.connect(Net.java:458)
    at sun.nio.ch.Net.connect(Net.java:450)
    at sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:648)
    at java.nio.channels.SocketChannel.open(SocketChannel.java:189)
    at org.voltdb.client.ConnectionUtil.getAuthenticatedConnection(ConnectionUtil.java:154)
    at org.voltdb.client.ConnectionUtil.getAuthenticatedConnection(ConnectionUtil.java:142)
    at org.voltdb.client.ConnectionUtil.getAuthenticatedConnection(ConnectionUtil.java:134)
    at org.voltdb.client.Distributer.createConnectionWithHashedCredentials(Distributer.java:878)
    at org.voltdb.client.ClientImpl.createConnectionWithHashedCredentials(ClientImpl.java:189)
    at org.voltdb.client.ClientImpl.createConnection(ClientImpl.java:682)
    at src.java.tutorial.voltdb.integration.ConnectionTest.main(ConnectionTest.java:27)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)

タイムアウト時間を設定する方法はありますか?そのため、アプリケーションはそれほど長時間待つ必要はありません。正常な接続には通常数十ミリ秒しかかからないため、1000 ミリ秒以内に接続が確立されない場合は、何かがすでに間違っていると思います。

以下の設定を試してみました

clientConfig.setConnectionResponseTimeout(1000);

この場合、影響はまったくありません。したがって、この目的ではないと思います。

4

1 に答える 1

2

通常、データベースがダウンしているときにクライアントが接続を試みると、即座に接続拒否例外が発生します。次に例を示します。

Exception in thread "main" java.net.ConnectException: Connection refused
at sun.nio.ch.Net.connect0(Native Method)
at sun.nio.ch.Net.connect(Net.java:364)
at sun.nio.ch.Net.connect(Net.java:356)
at sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:623)
at java.nio.channels.SocketChannel.open(SocketChannel.java:184)
at org.voltdb.client.ConnectionUtil.getAuthenticatedConnection(ConnectionUtil.java:165)
at org.voltdb.client.ConnectionUtil.getAuthenticatedConnection(ConnectionUtil.java:153)
at org.voltdb.client.ConnectionUtil.getAuthenticatedConnection(ConnectionUtil.java:145)
at org.voltdb.client.Distributer.createConnectionWithHashedCredentials(Distributer.java:890)
at org.voltdb.client.ClientImpl.createConnectionWithHashedCredentials(ClientImpl.java:191)
at org.voltdb.client.ClientImpl.createConnection(ClientImpl.java:684)
at benchmark.Benchmark.<init>(Benchmark.java:17)
at benchmark.Benchmark.main(Benchmark.java:78)

一般に、「java.net.ConnectException: Connection timed out」は、クライアントが何らかの応答を受信できないファイアウォールがある場合、または他の原因が考えられる場合に発生する可能性があります。最初に確認することは、ポート 21212 (デフォルトの VoltDB データベース接続ポート) へのアクセスを妨げるファイアウォールまたはネットワーク設定があるかどうかです。

ClientConfig のsetConnectionResponseTimeout()設定は、ライブ接続がプロシージャ コールまたは ping から指定されたミリ秒数の間応答を受信しなかった場合にライブ接続を閉じるために使用されますが、新しい接続の作成には使用されません。

于 2015-05-29T14:31:11.953 に答える