Derby数据库使用问题记录
Syntax error: Encountered "<EOF>" at line 1, column 8
原因是:Druid在初始化连接池时会对每个建立的连接进行check,配置如下:
server:
port: 8086
spring:
datasource:
name: test
url: jdbc:derby:melon-daily.db
username: root
password: xxx
# 使用druid数据源
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: org.apache.derby.jdbc.EmbeddedDriver
filters: stat
maxActive: 20
initialSize: 1
maxWait: 60000
minIdle: 1
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: select 'x'
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
maxOpenPreparedStatements: 20
注意这里的配置:validationQuery: select ‘x’ 这个select ‘x’在mysql数据库是可以正常运行的,但是derby不支持这种写法。常见数据库的校验SQL如下:
SELECT 1/SELECT x
- H2
- MySQL
- Microsoft SQL Server (according to NimChimpsky)
- PostgreSQL
- SQLite
- Hive
SELECT 1 FROM DUAL
- Oracle
SELECT 1 FROM any_existing_table WHERE 1=0 or SELECT 1 FROM INFORMATION_SCHEMA.SYSTEM_USERS or CALL NOW()
- HSQLDB (tested with version 1.8.0.10)Note: I tried using a WHERE 1=0 clause on the second query, but it didn’t work as a value for Apache Commons DBCP’s validationQuery, since the query doesn’t return any rows
VALUES 1 or SELECT 1 FROM SYSIBM.SYSDUMMY1
- Apache Derby (via daiscog)
SELECT 1 FROM SYSIBM.SYSDUMMY1
- DB2
select count(*) from systables
- Informix
不过对于JDBC4,数据库已经通过API来验证连接了。所以这种验证方案在JDBC4中已经不推荐使用了
If your driver supports JDBC4 we strongly recommend not setting this property. This is for “legacy” databases that do not support the JDBC4 Connection.isValid() API. This is the query that will be executed just before a connection is given to you from the pool to validate that the connection to the database is still alive. Again, try running the pool without this property, HikariCP will log an error if your driver is not JDBC4 compliant to let you know. Default: none
比如创建表时,某一列叫user
create table m_sensitive_words(id int generated by default as identity, word varchar(40), user varchar(100), msg varchar(100))
Syntax error: Encountered “user” at line 1, column 91.
在SQL中使用引号标记列也是不容许的
create table m_sensitive_words(`id` int generated by default as identity, `word` varchar(40), `user` varchar(100), `msg` varchar(100))"
Lexical error at line 1, column 32. Encountered: “`” (96), after : “”.
内嵌模式只支持启动进程访问,外部进程无法访问。