Coder Social home page Coder Social logo

beecp's Introduction

图片  🏠| 中文| English

☕ Introduction

BeeCP is a small JDBC connection pool: high performance, lightweight code and good stability.

  • Support main popular database drivers
  • Support XAConnection/JTA
  • Pool features:CAS,single connection cache, queue reuse, non move waiting self spin, asynchronous add , safe close,web monitor and so on
  • Good robustness and quick response to unexpected situations (such as network disconnection and database service crash)
  • Good interface extensibility

⬇️ Download

Java7+

<dependency>
   <groupId>com.github.chris2018998</groupId>
   <artifactId>beecp</artifactId>
   <version>4.0.6</version>
</dependency>

Java6

<dependency>
   <groupId>com.github.chris2018998</groupId>
   <artifactId>beecp</artifactId>
   <version>1.6.10</version>
</dependency>

🚜 Example

👉 Example-1(independent)

BeeDataSourceConfig config = new BeeDataSourceConfig();
config.setDriverClassName("com.mysql.jdbc.Driver");
config.setJdbcUrl("jdbc:mysql://localhost/test");
config.setUsername("root");
config.setPassword("root");
BeeDataSource ds=new BeeDataSource(config);
Connection con=ds.getConnection();
....

👉 Example-2(Springbooot)

application.properties

spring.datasource.username=root
spring.datasource.password=root
spring.datasource.url=jdbc:mysql://localhost/test
spring.datasource.driverClassName=com.mysql.jdbc.Driver

DataSourceConfig.java

@Configuration
public class DataSourceConfig {
  @Value("${spring.datasource.username}")
  private String user;
  @Value("${spring.datasource.password}")
  private String password;
  @Value("${spring.datasource.url}")
  private String url;
  @Value("${spring.datasource.driverClassName}")
  private String driver;

  @Bean
  @Primary
  @ConfigurationProperties(prefix="spring.datasource")
  public DataSource primaryDataSource() {
    return DataSourceBuilder.create().type(cn.beecp.BeeDataSource.class).build();
  }
  
  @Bean
  public DataSource secondDataSource() {
   return new BeeDataSource(new BeeDataSourceConfig(driver,url,user,password));
  }
}

📖 Function map

图片

💻 Runtime monitor

Two ways are provided in pool

  • Jmx mbean
  • Pool Vo(get it by call datasource method:getPoolMonitorVo)

☀️ If your project is using beecp and base on springboot, we recommend our datasource management tool:BeeCP-Starter (web ui, no code development ,just some configuration)

图片

🍒 Compare to HikariCP

Compare Item BeeCP HikariCP
key technology ThreadLocal,Semaphore,ConcurrentLinkedQueue,Thread FastList,ConcurrentBag,ThreadPoolExecutor
Similarities CAS,pre-generate proxy,driver statement cache
Difference fair mode,supprt XA,recycle hold-timeout connection,single connection cache,queue reuse,non move waiting spin pool pause
Files 37 files,95KB Jar 44 files,158KB Jar
Performance 40 percent faster (HikariCP bench)

🍏 Code quality

图片

🏭 User Extend

1:Connection factory interfaces

Two interfaces,which are using to create raw connection or raw XAConnection for self-implement and its subclass name need set to 'connectionFactoryClassName' in Bee DataSourceConfig object.

图片

图片

Example

图片

2:Jdbc password ciphertext decrypt class

图片

📘 Configuration

Item Name Desc Default
username a username link to db null
password password of a db user null
jdbcUrl url link to db null
driverClassName jdbc driver class name null
poolName a generation name assgin to it if not set null
fairMode pool work mode false
initialSize connection number of creation on pool initizization 0
asyncCreateInitConnection creation mode for initial connections false(synchronization mode)
maxActive max reachable count of connections in pool 10
borrowSemaphoreSize max permit size of pool semaphore min(maxActive/2,CPU size)
defaultAutoCommit initial value of autoCommit prop on created connections null,read prop value from first connection as initial value for other connections
defaultTransactionIsolationCode initial value of transactionIsolation prop on created connections null,read prop value from first connection as initial value for other connections
enableThreadLocal thread local cache enable indicator true,set false to support virtual threads
defaultCatalog initial value of catalog prop on created connections null,read prop value from first connection as initial value for other connections
defaultSchema initial value of schema prop on created connections null,read prop value from first connection as initial value for other connections
defaultReadOnly initial value of readOnly prop on created connections null,read prop value from first connection as initial value for other connections
maxWait max wait time in pool for borrowers to get connection,time unit:milliseconds 8000
idleTimeout idle time out for connections in pool,time unit:milliseconds 18000
holdTimeout max inactive time of borrowed connections,time unit:milliseconds 0(never timeout)
aliveTestSql alive test sql on borrowed connections,pool remove dead connections SELECT 1
aliveTestTimeout max wait time to get validation result on test connectionstime unit:seconds 3
aliveAssumeTime a gap time value from last activity time to borrowed time point,if less,not test,time unit:milliseconds 500
forceCloseUsingOnClear indicator on direct closing borrowed connections while pool clears false
timerCheckInterval an interval time to scan idle connections,time unit:milliseconds 18000
connectionFactoryClassName connection factory class name null
sqlExceptionCodeList store sql exception codes for connection eviction check null,related methods:addSqlExceptionCode,removeSqlExceptionCode
sqlExceptionStateList store sql exception state for connection eviction check null,related methods:addSqlExceptionCode,removeSqlExceptionCode
evictPredicateClassName eviction predicate class name null,pool only it to check exception if set
jdbcLinkInfoDecoderClassName short lifecycle object and used to decode jdbc link info null
forceDirtyOnSchemaAfterSet dirty force indicator on schema property under PG driver false
forceDirtyOnCatalogAfterSet dirty force indicator on schema property under PG driver false
enableJmx enable indicator to register configuration and pool to Jmx false
printConfigInfo boolean indicator,true:print config item info on pool starting false
printRuntimeLog boolean indicator,true:print runtime log false

beecp's People

Contributors

chris2018998 avatar dependabot[bot] avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

beecp's Issues

默认配置下3.1.2升级到3.2.1使用Sqlite报错。

Caused by: java.sql.SQLException: SQLite supports only TRANSACTION_SERIALIZABLE and TRANSACTION_READ_UNCOMMITTED.
	at org.sqlite.SQLiteConnection.setTransactionIsolation(SQLiteConnection.java:164)
	at cn.beecp.pool.FastConnectionPool.setDefaultOnRawConn(FastConnectionPool.java:244)

看了下源码变更,FastConnectionPool里setTransactionIsolation设置默认值失败旧版是打印warn日志,新版本直接抛出异常。

而默认的Isolation在Sqlite下不支持,导致创建连接池失败。

建议:

默认配置不应该报错,而是保留所有默认配置,保证开箱可用。

能优化一下日志吗?

1: 能否在动态改变日志打印模式,比如增加个调试模式打印,有的时候,在生产项目中,我们想临时看看池的运行状态,有几个在用,平时运行时不用打印。

2:项目启动时候参数信息打印, 能否美化一下? 比如参照一下光连接池的做法?

Hikari换成BeeCP报错(beetlsql)

import cn.hutool.setting.dialect.Props;
import com.zaxxer.hikari.HikariDataSource;
import org.beetl.sql.core.*;
import org.beetl.sql.core.db.MySqlStyle;
import org.beetl.sql.gen.SourceBuilder;
import org.beetl.sql.gen.SourceConfig;
import org.beetl.sql.gen.simple.EntitySourceBuilder;
import org.beetl.sql.gen.simple.MDSourceBuilder;
import org.beetl.sql.gen.simple.MapperSourceBuilder;
import org.beetl.sql.gen.simple.SimpleMavenProject;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicReference;

public class MysqlGenerator {
public static void main(String[] args) {
SQLManager sqlManager = createSQLManager();
SourceConfig config = new SourceConfig(sqlManager, createSourceBuilder());
config.setPreferDoubleType(SourceConfig.PreferDoubleType.BigDecimal);
config.setPreferDateType(SourceConfig.PreferDateType.LocalDate);
SimpleMavenProject mavenProject = createBaseProject();
config.genAll(mavenProject);
}

public static SQLManager createSQLManager() {
    AtomicReference<Props> props = new AtomicReference<>(new Props("application.properties"));
    HikariDataSource ds = new HikariDataSource();
    ds.setJdbcUrl(props.get().getProperty("spring.datasource.url"));
    ds.setUsername(props.get().getProperty("spring.datasource.username"));
    ds.setPassword(props.get().getProperty("spring.datasource.password"));
    ds.setDriverClassName(props.get().getProperty("spring.datasource.driver-class-name"));
    ds.setAutoCommit(props.get().getBool("spring.datasource.hikari.auto-commit", true));
    ds.setConnectionTimeout(props.get().getLong("spring.datasource.hikari.connection-timeout", 30000L));
    ds.setIdleTimeout(props.get().getLong("spring.datasource.hikari.idle-timeout", 600000L));
    ds.setMaxLifetime(props.get().getLong("spring.datasource.hikari.max-lifetime", 1800000L));
    ds.setConnectionTestQuery(props.get().getProperty("spring.datasource.hikari.connection-test-query"));
    ds.setMinimumIdle(props.get().getInt("spring.datasource.hikari.minimum-idle", 10));
    ds.setMaximumPoolSize(props.get().getInt("spring.datasource.hikari.maximum-pool-size", 100));
    ds.setPoolName(props.get().getProperty("spring.datasource.hikari.pool-name"));
    ds.setReadOnly(props.get().getBool("spring.datasource.hikari.read-only", false));
    ConnectionSource connectionSource = ConnectionSourceHelper.getSingle(ds);
    String sqlPath = props.get().getProperty("beetlsql.sqlManager1.sqlPath");
    String charset = props.get().getProperty("beetlsql.sqlManager1.sqlFileCharset");
    SQLManagerBuilder sqlManagerBuilder = SQLManager.newBuilder(connectionSource)
            .setDbStyle(new MySqlStyle())
            .setNc(new UnderlinedNameConversion())
            .setSqlLoader(sqlPath, charset);
    return sqlManagerBuilder.build();
}

public static SimpleMavenProject createBaseProject() {
    AtomicReference<Props> props = new AtomicReference<>(new Props("application.properties"));
    String basePackage = props.get().getProperty("beetlsql.sqlManager1.basePackage");
    SimpleMavenProject project = new SimpleMavenProject();
    project.setBasePackage(basePackage);
    return project;
}

public static List<SourceBuilder> createSourceBuilder() {
    List<SourceBuilder> sourceBuilder = new ArrayList<>();
    SourceBuilder entityBuilder = new EntitySourceBuilder();
    SourceBuilder mapperBuilder = new MapperSourceBuilder();
    SourceBuilder mdBuilder = new MDSourceBuilder();
    sourceBuilder.add(entityBuilder);
    sourceBuilder.add(mapperBuilder);
    sourceBuilder.add(mdBuilder);
    return sourceBuilder;
}

}
原先的代码如下,将Hikari换成BeeCP后报错内容如下:
Exception in thread "main" java.lang.NullPointerException
at cn.beecp.pool.ProxyResultSetBase.close(ProxyResultSetBase.java:73)
at org.beetl.sql.core.meta.SchemaMetadataManager.initMetadata(SchemaMetadataManager.java:257)
at org.beetl.sql.core.meta.SchemaMetadataManager.allTable(SchemaMetadataManager.java:96)
at org.beetl.sql.gen.SourceConfig.genAll(SourceConfig.java:176)
at org.beetl.sql.gen.SourceConfig.genAll(SourceConfig.java:194)
at com.msj.beetlsqldemo.util.MysqlGenerator.main(MysqlGenerator.java:26)

版本:3.1.5(1.6.9不报错)

设置autocommit了,还是会报错

java.lang.reflect.UndeclaredThrowableException
at com.sun.proxy.$Proxy50.setAutoCommit(Unknown Source)
at org.sagacity.sqltoy.utils.SqlUtil.executeSql(SqlUtil.java:1406)
at org.sagacity.sqltoy.dialect.DialectFactory$2.doConnection(DialectFactory.java:304)
at org.sagacity.sqltoy.utils.DataSourceUtils.processDataSource(DataSourceUtils.java:493)
at org.sagacity.sqltoy.dialect.DialectFactory.executeSql(DialectFactory.java:292)
at org.sagacity.sqltoy.support.SqlToyDaoSupport.executeSql(SqlToyDaoSupport.java:524)
at org.sagacity.sqltoy.support.SqlToyDaoSupport.deleteByQuery(SqlToyDaoSupport.java:1068)
at org.sagacity.sqltoy.dao.impl.SqlToyLazyDaoImpl.deleteByQuery(SqlToyLazyDaoImpl.java:945)
at org.sagacity.sqltoy.dao.impl.SqlToyLazyDaoImpl$$FastClassBySpringCGLIB$$e709e869.invoke()
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:779)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:692)
at org.sagacity.sqltoy.dao.impl.SqlToyLazyDaoImpl$$EnhancerBySpringCGLIB$$5b0cf665.deleteByQuery()
at com.ild.de.config.service.impl.EdeControlServiceImpl.delete(EdeControlServiceImpl.java:44)
at com.ild.de.config.handler.ViewEdeControlUnInterceptHanlerImpl.exec(ViewEdeControlUnInterceptHanlerImpl.java:57)
at com.ild.de.config.handler.ViewEdeControlUnInterceptHanlerImpl.exec(ViewEdeControlUnInterceptHanlerImpl.java:27)
at xyz.erupt.core.controller.EruptDataController.execEruptOperator(EruptDataController.java:156)
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:498)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:197)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:141)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1060)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:962)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:652)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:733)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at xyz.erupt.security.interceptor.HttpServletRequestFilter.doFilter(HttpServletRequestFilter.java:43)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.ssssssss.magicapi.config.MagicCorsFilter.doFilter(MagicCorsFilter.java:42)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:346)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:887)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1684)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.GeneratedMethodAccessor189.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at cn.beecp.boot.datasource.sqltrace.ConnectionHandler.invoke(ConnectionHandler.java:44)
... 78 more
Caused by: java.sql.SQLException: Execute 'commit' or 'rollback' before this operation
at cn.beecp.pool.PoolStaticCenter.(PoolStaticCenter.java:61)
at cn.beecp.boot.datasource.SpringBootDataSourceUtil.getConfigValue(SpringBootDataSourceUtil.java:111)
at cn.beecp.boot.datasource.MultiDataSourceRegister.getIdList(MultiDataSourceRegister.java:101)
at cn.beecp.boot.datasource.MultiDataSourceRegister.registerBeanDefinitions(MultiDataSourceRegister.java:78)
at org.springframework.context.annotation.ImportBeanDefinitionRegistrar.registerBeanDefinitions(ImportBeanDefinitionRegistrar.java:86)
at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.lambda$loadBeanDefinitionsFromRegistrars$1(ConfigurationClassBeanDefinitionReader.java:396)
at java.util.LinkedHashMap.forEach(LinkedHashMap.java:684)
at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsFromRegistrars(ConfigurationClassBeanDefinitionReader.java:395)
at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForConfigurationClass(ConfigurationClassBeanDefinitionReader.java:157)
at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitions(ConfigurationClassBeanDefinitionReader.java:129)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:342)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:246)
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:311)
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:112)
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:745)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:563)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:144)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:767)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:426)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:326)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1311)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1300)
at com.ild.de.config.ExampleApplication.main(ExampleApplication.java:30)

连接池使用建议,个人也发个贴

连接池作用等同于一个图书馆,有借有还的动作。
连接池的连接数一般是有限的,因此使用完毕后,需要及时归还池中,以便其他线程借取,
如果连接长时间不关闭,尤其是在所有连接消耗完毕后,那么其他借用者会出现过时间等待(表现卡顿,无反应,最后超时)。参考代码

  Connection con=null;
  try{
      con = datasource.getConnection();
      ............
  }finally{
     con.close(); // <---  此处语句很重要。
 }

Database can not be null

因为业务需要,会基于参数变更connection的catalog。
默认不设置catalog,连接如下:
127.0.0.1:3306/?useUnicode=true&useSSL=false
在设置catalog后,beecp执行完SQL,关闭connection时,通过recycleSelf调用resetRawConn按照defCatalog进行复位。上述情况,在复位时,会抛出异常:java.sql.SQLException: Database can not be null
产生如下问题:
1、出于什么考虑,再会connection关闭后进行复位?
2、是否可以关闭该复位?

运行一段时间后会报错org.stone.beecp,pool.exception

报了如下错误:
网络和数据库都是正常的。
Failed to obtain uDec Connection, nested exception is org.stone.beecp,pool.exception.Connectiol
CreateException. wait timeout on pool lock acquistion
image

版本

com.github.chris2018998
beecp-spring-boot-starter
1.8.5

配置:
255bedcf18ce1f19088a6b99340cce6

能支持JDK11吗?

BeeCP我们投入使用3个多月了,很稳定,没有发生什么错误,谢谢您。

想咨询一下,BeeCP能升级一下支持JDK11吗?

SQLite supports only TRANSACTION_SERIALIZABLE and TRANSACTION_READ_UNCOMMITTED

使用SQLite时,使用BeeCP默认的配置项,默认TRANSACTION_READ_COMMITTED不支持。
BeeCP 3.x
BeeDataSourceConfig中:

//default transaction isolation description,match isolation code can be set to <code>defaultTransactionIsolationCode</code>
private String defaultTransactionIsolation = TransactionIsolationLevel.LEVEL_READ_COMMITTED;

在BeeCP 2.x中默认是null不存在问题。

我现在有一个应用场景,需要连接200多台mysql服务器,而且网络非常不好

我现在有一个应用场景,需要连接200多台mysql服务器,而且网络非常不好,时断时续,大量丢包是正常现象,中间可能断开几个小时或十几个小时是常事。这种场景下,我分别用了阿里的druid 和 hikaricp 组件,效果非常不好,阿里的druid表现非常糟糕,hikaricp比较好一些,但时间一长,还是要手动去销毁 连接池,再重建 连接池 才行。您这个组件,在应对这种情况的话,您估计,表现会好一些吗?

实际应用连接池性能测试比hikari要低

spring boot 2.3,oracle 12数据库
beecp版本:2.5.4..2
hikari版本:3.4.5
jdk:11

测试语句:select 1 from dual;
jmeter通过http请求应用api进行压测,

2种负载情况下,beecp都比hikari的结果要差一些,这个跟beecp官方给出的测试结果有所不同,请问可能是什么原因导致的呢?

测试数据如下:
连接池:10,50并发用户
beecp结果:
image

hikari结果:
image

连接池:32,100并发用户
beecp结果:
image

hikari结果:
image

如何懒启动数据源

beecp做的不错,我的多数据源项目开始做beecp的集成,遇到了问题,不知道如何懒启动。

baomidou/dynamic-datasource@a630e21

开始尝试过注释掉的代码,调用copyTo就不用Init了, 但是copyTo似乎和我理解的不一样, 使用后所有参数null了。还有其他办法么?

    public DataSource createDataSource(DataSourceProperty dataSourceProperty) {
        BeeDataSourceConfig config = dataSourceProperty.getBee().toBeeCpConfig(beeCpConfig);
        config.setUsername(dataSourceProperty.getUsername());
        config.setPassword(dataSourceProperty.getPassword());
        config.setJdbcUrl(dataSourceProperty.getUrl());
        config.setPoolName(dataSourceProperty.getPoolName());
        String driverClassName = dataSourceProperty.getDriverClassName();
        if (!StringUtils.isEmpty(driverClassName)) {
            config.setDriverClassName(driverClassName);
        }
        if (!dataSourceProperty.getLazy()) {
            return new BeeDataSource(config);
        } else {
            log.warn("beecp current not support lazy init");
            return new BeeDataSource(config);
        }
//        BeeDataSource beeDataSource = new BeeDataSource();
//        try {
//            Method copyToMethod = BeeDataSourceConfig.class.getDeclaredMethod("copyTo", BeeDataSourceConfig.class);
//            copyToMethod.setAccessible(true);
//            copyToMethod.invoke(beeDataSource, config);
//        } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {
//            e.printStackTrace();
//        }
//        return beeDataSource;
    }

另外: 我觉得你这边做纯粹一点吧,动态数据源就不再继续造轮子了。 我们可以深度合作,尤其是在多数据源下的监控。

请问数据库连接池的有什么局限性吗?

今天是中秋节,首先祝您节日快乐,感谢您贡献一个高性能的连接池,它的性能确实非常棒,代码质量也很优秀,国产的骄傲!

我这里有个疑问,请您帮忙解答:当今分布式开发为主流背景下,连接池有什么局限性吗? 以及如何改变呢?

严重BUG :spring cloud下启动失败

背景:在 shoulder-platform 中尝试将 beeCP作为连接池技术选型,中遇到了以下问题。
根本原因:设计问题,BeeCPDataSource close 时可能抛异常
直接原因:spring cloud 启动时会加载两次上下文,在切换上下文时,会关闭第一次加载中的dataSource,但此时还未初始化,BeeCP close 抛出异常,导致应用无法启动。

解决方案:可以参考 Durid 或者 HikairCP,如果未启动,仅记录日志。

复现参考:[shoulder-platform](https://github.com/ChinaLym/shoulder-platform](shoulder-platform](https://github.com/ChinaLym/shoulder-platform) sms短信中心

默认配置下多核处理器中borrowConcurrentSize大于maxActive

在BeeDataSourceConfig中默认的:

borrowConcurrentSize = Runtime.getRuntime().availableProcessors();
maxActive = 10;

此项默认配置有问题,当CPU核心数超过10时,默认配置会检查无效。

我用的锐龙CPU,6核12线程,得到的availableProcessors为12;

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.