はじめまして
Spring + Hibernate + Mysqlの動作するサンプルがあり、
これをDBを NoSQLのCassandraにして動作させたいのですが、下記のようなエラーが出て動作しません。
この解決する方法ご存知の方がいらっしゃれば、どうぞご教授ください。
※具体的には、spring.xmlでのdataSourceの設定部分に誤りがあるとみています。
※なお、SpringやHibernateを使用しない Java + Cassandra での通常のJDBC接続には成功しています。
状況
Tomcat8起動時点:エラーなし
アプリケーションへのアクセス時点:以下のエラー(長いので一番最後に掲載します。)
アクセス先URL
http://localhost:8080/databasesample/deptList
環境
IDE:pleiades-e4.5
JRE:JavaSE-1.8
Tomcat:8.0.26
org.springframework-version:4.0.3.RELEASE
hibernate.version:4.3.6.Final
Cassandra:version3.9
ソース変更点抜粋
ソース自体はそのまま使いたいので、DBの変更部分コンフィグ系のみの修正です。
$ git diff 75b846f22b7a666c72a91d153dbec7075acd41bf 969c0d976a68e6e9e1ee26cbd9b697a2f5085af2 diff --git a/pom.xml b/pom.xml + <!-- https://mvnrepository.com/artifact/org.hibernate.ogm/hibernate-ogm-core --> + <dependency> + <groupId>org.hibernate.ogm</groupId> + <artifactId>hibernate-ogm-cassandra</artifactId> + <version>4.2.0.Final</version> + </dependency> + <!-- https://mvnrepository.com/artifact/org.apache-extras.cassandra-jdbc/cassandra-jdbc --> + <dependency> + <groupId>org.apache-extras.cassandra-jdbc</groupId> + <artifactId>cassandra-jdbc</artifactId> + <version>1.2.5</version> + </dependency> diff --git a/src/main/resources/spring.xml b/src/main/resources/spring.xml - <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> - <property name="driverClassName" value="com.mysql.jdbc.Driver"/> - <property name="url" value="jdbc:mysql://localhost:3306/spring_database"/> - <property name="username" value="hoge"/> - <property name="password" value="xxxx"/> <property name="testOnBorrow" value="true"/> <property name="testOnReturn" value="true"/> <property name="testWhileIdle" value="true"/> <property name="numTestsPerEvictionRun" value="3"/> <property name="minEvictableIdleTimeMillis" value="1800000"/> <property name="validationQuery" value="SELECT 1"/> </bean> + <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> + <property name="driverClassName" value="org.apache.cassandra.cql.jdbc.CassandraDriver"/> + <property name="url" value="jdbc:cassandra://localhost:9160/spring_database"/> + <property name="username" value=""/> + <property name="password" value=""/> <property name="testOnBorrow" value="true"/> <property name="testOnReturn" value="true"/> <property name="testWhileIdle" value="true"/> <property name="numTestsPerEvictionRun" value="3"/> <property name="minEvictableIdleTimeMillis" value="1800000"/> <property name="validationQuery" value="SELECT 1"/> </bean>
エラーログ
例外 org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.hibernate.exception.GenericJDBCException: Could not open connection org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:973) org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852) javax.servlet.http.HttpServlet.service(HttpServlet.java:622) org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837) javax.servlet.http.HttpServlet.service(HttpServlet.java:729) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:108) 原因 org.hibernate.exception.GenericJDBCException: Could not open connection org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:54) org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:126) org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:112) org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.obtainConnection(LogicalConnectionImpl.java:235) org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.getConnection(LogicalConnectionImpl.java:171) org.hibernate.engine.jdbc.internal.StatementPreparerImpl.connection(StatementPreparerImpl.java:63) org.hibernate.engine.jdbc.internal.StatementPreparerImpl$5.doPrepare(StatementPreparerImpl.java:162) org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:186) 原因 org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (org.apache.thrift.transport.TTransportException: java.net.SocketException: Connection reset) org.apache.commons.dbcp.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:1549) org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1388) org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044) ... 原因 java.sql.SQLNonTransientConnectionException: org.apache.thrift.transport.TTransportException: java.net.SocketException: Connection reset org.apache.cassandra.cql.jdbc.CassandraConnection.<init>(CassandraConnection.java:159) org.apache.cassandra.cql.jdbc.CassandraDriver.connect(CassandraDriver.java:92) org.apache.commons.dbcp.DriverConnectionFactory.createConnection(DriverConnectionFactory.java:38) org.apache.commons.dbcp.PoolableConnectionFactory.makeObject(PoolableConnectionFactory.java:582) org.apache.commons.dbcp.BasicDataSource.validateConnectionFactory(BasicDataSource.java:1556) ... 原因 org.apache.thrift.transport.TTransportException: java.net.SocketException: Connection reset org.apache.thrift.transport.TIOStreamTransport.read(TIOStreamTransport.java:129) org.apache.thrift.transport.TTransport.readAll(TTransport.java:84) org.apache.thrift.transport.TFramedTransport.readFrame(TFramedTransport.java:129) org.apache.thrift.transport.TFramedTransport.read(TFramedTransport.java:101) ...
以上、よろしくお願いいたします。
調査続行
cassandra 3.9 から、cassandra 2.1.16 に変えてみたらエラーが少し変わりました。
org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (line 1:7 no viable alternative at input '1' (SELECT [1]) 'SELECT 1') org.apache.commons.dbcp.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:1549) org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1388) org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)
まあ、version 3.9 で動かしたい気もありますが、とりあえず 2.X で確認してみます。
spring.xmlは読み込まれてはいて、「<bean id="dataSource"」のproperty設定部分の問題かと。
そこで、spring.xmlの以下をコメントアウトし
<!-- <property name="validationQuery" value="SELECT 1"/> -->
再度実行してみると、また次のエラーに変わりました。
原因 org.hibernate.exception.SQLGrammarException: could not prepare statement org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:80) org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49) org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:126) ... 原因 java.sql.SQLSyntaxErrorException: InvalidRequestException(why:line 1:113 extraneous input 'department0_' expecting EOF) org.apache.cassandra.cql.jdbc.CassandraPreparedStatement.<init>(CassandraPreparedStatement.java:103) org.apache.cassandra.cql.jdbc.CassandraConnection.prepareStatement(CassandraConnection.java:388) org.apache.cassandra.cql.jdbc.CassandraConnection.prepareStatement(CassandraConnection.java:372) ... 原因 InvalidRequestException(why:line 1:113 extraneous input 'department0_' expecting EOF) org.apache.cassandra.thrift.Cassandra$prepare_cql3_query_result.read(Cassandra.java:39567) org.apache.thrift.TServiceClient.receiveBase(TServiceClient.java:78) org.apache.cassandra.thrift.Cassandra$Client.recv_prepare_cql3_query(Cassandra.java:1625) ...
departmentsテーブル(COLUMN FAMILY)が対象ではあるけど、「department0_」というのはなくて、どこかで作られているのか不明です。Cassandraの内部で生成されているのだとすると、Cassandraまではたどり着いているとみていいだろうか。。
現状は、ここまでしかわかっていません。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/12/10 18:46
2016/12/12 07:45