18336


JDBC（MariaDB Java）で１つのコネクションで  
一度に多数のリクエストを送信した場合、同時にSQLの実行が行われるのでしょうか？

複数のスレッドで同時に送信という状態でございます。


CC BY-SA 3.0
2015-10-27T11:50:20.300
18135
2015-11-03T02:59:33.580
2015-10-28T04:00:53.300
10346
10346
question
java sql jdbc
JDBCの１つのコネクションに同時にリクエストを送信したら


そもそもスレッドセーフでは無いのでは…と思い込んでいたのですが、どうも仕様ではスレッドセーフであることを要求しているようですね。古い(urlから察するにjdk1.2時代)＆オフィシャルかどうかよくわからないドキュメントしか見つけられませんでしたが…  
<http://www.cs.mun.ca/~michael/java/jdk1.2-docs/guide/jdbc/spec/jdbc-
spec.frame9.html>

> 9.2 Multi-threading  
>  We require that all operations on all the java.sql objects be multi-thread
> safe and able to cope  
>  correctly with having several threads simultaneously calling the same
> object.

(書いている最中に思ったのですが、現在の仕様ではスレッドセーフであることは要求されていない可能性もありますね。)

仕様の話はおいておいて、実際のMariaDB実装はどうなっているのかというと…

`java.sql.Connection` のMariaDB実装は
[`org.mariadb.jdbc.MariaDbConnection`](https://github.com/MariaDB/mariadb-
connector-j/blob/6476064e9c9e488efde8ca179111ac3c7fe94bc2/src%2Fmain%2Fjava%2Forg%2Fmariadb%2Fjdbc%2FMariaDbConnection.java),
そして [`crateStatement` メソッド](https://github.com/MariaDB/mariadb-
connector-j/blob/6476064e9c9e488efde8ca179111ac3c7fe94bc2/src%2Fmain%2Fjava%2Forg%2Fmariadb%2Fjdbc%2FMariaDbConnection.java#L149-L152)で取得できる
`java.sql.Statement` の実装は
[`org.mariadb.jdbc.MariaDbStatement`](https://github.com/MariaDB/mariadb-
connector-j/blob/6476064e9c9e488efde8ca179111ac3c7fe94bc2/src%2Fmain%2Fjava%2Forg%2Fmariadb%2Fjdbc%2FMariaDbStatement.java)
のようです。  
このコードを見てみると、[`execute` メソッドの中](https://github.com/MariaDB/mariadb-
connector-j/blob/6476064e9c9e488efde8ca179111ac3c7fe94bc2/src%2Fmain%2Fjava%2Forg%2Fmariadb%2Fjdbc%2FMariaDbStatement.java#L275)で
[`ReentrantLock#lock()`](https://docs.oracle.com/javase/jp/8/api/java/util/concurrent/locks/ReentrantLock.html#lock--)
によって `Connection` インスタンス単位のロックを取得しているのがわかります。

要するに、

> 一度に多数のリクエストを送信した場合、同時にSQLの実行が行われるのでしょうか？

の回答としては、  
「
**JDBCドライバが[逐次化](https://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%AA%E3%82%A2%E3%83%A9%E3%82%A4%E3%82%BA#.E9.80.90.E6.AC.A1.E5.8C.96)するので同時には実行されません**」  
ということになります。


CC BY-SA 3.0
2015-11-02T17:49:34.413
18336
2015-11-03T02:59:33.580
2015-11-03T02:59:33.580
2808
2808
18135
answer