/** * The core Annotation to switch datasource. It can be annotated at class or method. */ @Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public@interface DS {
/** * groupName or specific database name or spring SPEL name. * * @return the database you want to switch */ String value(); }
value 属性使用的是 application.properties 中声明的数据源名称,即 master 和 slave。
2024-10-30T01:22:25.508+08:00 INFO 36293 --- [ main] c.z.h.HikariDataSource : master - Starting... 2024-10-30T01:22:25.656+08:00 INFO 36293 --- [ main] c.z.h.p.HikariPool : master - Added connection org.postgresql.jdbc.PgConnection@4cfa83f9 2024-10-30T01:22:25.657+08:00 INFO 36293 --- [ main] c.z.h.HikariDataSource : master - Start completed. 2024-10-30T01:22:25.658+08:00 INFO 36293 --- [ main] c.z.h.HikariDataSource : slave - Starting... 2024-10-30T01:22:25.704+08:00 INFO 36293 --- [ main] c.z.h.p.HikariPool : slave - Added connection org.postgresql.jdbc.PgConnection@270d43a7 2024-10-30T01:22:25.704+08:00 INFO 36293 --- [ main] c.z.h.HikariDataSource : slave - Start completed. 2024-10-30T01:22:25.704+08:00 INFO 36293 --- [ main] c.b.d.d.DynamicRoutingDataSource : dynamic-datasource - add a datasource named [slave] success 2024-10-30T01:22:25.704+08:00 INFO 36293 --- [ main] c.b.d.d.DynamicRoutingDataSource : dynamic-datasource - add a datasource named [master] success 2024-10-30T01:22:25.705+08:00 INFO 36293 --- [ main] c.b.d.d.DynamicRoutingDataSource : dynamic-datasource initial loaded [2] datasource,primary datasource named [master]
Creating a new SqlSession SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@13a268cd] was not registered for synchronization because synchronization is not active JDBC Connection [HikariProxyConnection@1370822209 wrapping org.postgresql.jdbc.PgConnection@270d43a7] will not be managed by Spring ==> Preparing: SELECT id,user_code,user_name,valid_date,invalid_date,valid_flag,delete_flag,company_code,department_code,create_time,operate_time,create_by_code,operate_by_code FROM z2huo_user WHERE (user_code = ?) ==> Parameters: 18182024(String) <== Columns: id, user_code, user_name, valid_date, invalid_date, valid_flag, delete_flag, company_code, department_code, create_time, operate_time, create_by_code, operate_by_code <== Row: 3, 18182024, 张二爷, 2020-01-01, 2077-01-01, 1, 0, null, null, 2024-04-10 01:23:17, 2024-04-10 01:23:17, null, null <== Total: 1 Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@13a268cd]
JDBC Connection [HikariProxyConnection@1370822209 wrapping org.postgresql.jdbc.PgConnection@270d43a7] will not be managed by Spring
可以看到,使用的是从库的数据库连接。
insert 方法的日志:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
2024-10-30T01:25:41.482+08:00 INFO 37410 --- [ main] c.z.h.HikariDataSource : master - Starting... 2024-10-30T01:25:41.596+08:00 INFO 37410 --- [ main] c.z.h.p.HikariPool : master - Added connection org.postgresql.jdbc.PgConnection@4cfa83f9 2024-10-30T01:25:41.596+08:00 INFO 37410 --- [ main] c.z.h.HikariDataSource : master - Start completed. 2024-10-30T01:25:41.598+08:00 INFO 37410 --- [ main] c.z.h.HikariDataSource : slave - Starting... 2024-10-30T01:25:41.639+08:00 INFO 37410 --- [ main] c.z.h.p.HikariPool : slave - Added connection org.postgresql.jdbc.PgConnection@270d43a7 2024-10-30T01:25:41.639+08:00 INFO 37410 --- [ main] c.z.h.HikariDataSource : slave - Start completed. 2024-10-30T01:25:41.639+08:00 INFO 37410 --- [ main] c.b.d.d.DynamicRoutingDataSource : dynamic-datasource - add a datasource named [slave] success 2024-10-30T01:25:41.639+08:00 INFO 37410 --- [ main] c.b.d.d.DynamicRoutingDataSource : dynamic-datasource - add a datasource named [master] success 2024-10-30T01:25:41.639+08:00 INFO 37410 --- [ main] c.b.d.d.DynamicRoutingDataSource : dynamic-datasource initial loaded [2] datasource,primary datasource named [master]
Creating a new SqlSession SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@47fa3671] was not registered for synchronization because synchronization is not active JDBC Connection [HikariProxyConnection@1891984436 wrapping org.postgresql.jdbc.PgConnection@4cfa83f9] will not be managed by Spring ==> Preparing: INSERT INTO z2huo_user ( id, user_code, user_name, create_time, operate_time, create_by_code, operate_by_code ) VALUES ( ?, ?, ?, ?, ?, ?, ? ) ==> Parameters: 1851314479528370177(Long), 11111111(String), insertUserTest(String), null, null, null, null <== Updates: 1 Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@47fa3671]
org.springframework.jdbc.UncategorizedSQLException: ### Error updating database. Cause: org.postgresql.util.PSQLException: ERROR: cannot execute INSERT in a read-only transaction ### The error may exist in cn/z2huo/demo/mapper/user/UserMapper.java (best guess) ### The error may involve cn.z2huo.demo.mapper.user.UserMapper.insert-Inline ### The error occurred while setting parameters ### SQL: INSERT INTO z2huo_user ( id, user_code, user_name, create_time, operate_time, create_by_code, operate_by_code ) VALUES ( ?, ?, ?, ?, ?, ?, ? ) ### Cause: org.postgresql.util.PSQLException: ERROR: cannot execute INSERT in a read-only transaction ; uncategorized SQLException; SQL state [25006]; error code [0]; ERROR: cannot execute INSERT in a read-only transaction
at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:93) at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:439) at jdk.proxy2/jdk.proxy2.$Proxy75.insert(Unknown Source) at org.mybatis.spring.SqlSessionTemplate.insert(SqlSessionTemplate.java:272) at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:59) at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:149) at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:90) at jdk.proxy2/jdk.proxy2.$Proxy79.insert(Unknown Source) at cn.z2huo.demo.multidatasource.mybatisplus.service.impl.UserServiceImpl.insert(UserServiceImpl.java:34) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) at java.base/java.lang.reflect.Method.invoke(Method.java:580) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:355) at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) at com.baomidou.dynamic.datasource.aop.DynamicDataSourceAnnotationInterceptor.invoke(DynamicDataSourceAnnotationInterceptor.java:57) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:720) at cn.z2huo.demo.multidatasource.mybatisplus.service.impl.UserServiceImpl$$SpringCGLIB$$0.insert(<generated>) at cn.z2huo.demo.multidatasource.mybatisplus.service.impl.UserServiceImplTest.insert(UserServiceImplTest.java:42) at java.base/java.lang.reflect.Method.invoke(Method.java:580) at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) Caused by: org.postgresql.util.PSQLException: ERROR: cannot execute INSERT in a read-only transaction at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2713) at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2401) at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:368) at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:498) at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:415) at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:190) at org.postgresql.jdbc.PgPreparedStatement.execute(PgPreparedStatement.java:177) at com.zaxxer.hikari.pool.ProxyPreparedStatement.execute(ProxyPreparedStatement.java:44) at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.execute(HikariProxyPreparedStatement.java) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) at java.base/java.lang.reflect.Method.invoke(Method.java:580) at org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:58) at jdk.proxy3/jdk.proxy3.$Proxy140.execute(Unknown Source) at org.apache.ibatis.executor.statement.PreparedStatementHandler.update(PreparedStatementHandler.java:48) at org.apache.ibatis.executor.statement.RoutingStatementHandler.update(RoutingStatementHandler.java:75) at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:50) at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:117) at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:76) at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:197) at org.apache.ibatis.session.defaults.DefaultSqlSession.insert(DefaultSqlSession.java:184) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) at java.base/java.lang.reflect.Method.invoke(Method.java:580) at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:425) ... 22 more