Vibur DBCP - concurrent and dynamic JDBC connection pool

Overview

Vibur logo

Vibur DBCP is concurrent, fast, and fully-featured JDBC connection pool, which provides advanced performance monitoring capabilities, including slow SQL queries detection and logging, a non-starvation guarantee for application threads, statement caching, and Hibernate integration, among other features.

The project home page contains a detailed description of all Vibur features and configuration options, various configuration examples with Hibernate and Spring, and more.

Vibur DBCP is built on top of Vibur Object Pool - a general-purpose concurrent Java object pool.

The project maven coordinates are:

<dependency>
  <groupId>org.vibur</groupId>
  <artifactId>vibur-dbcp</artifactId>
  <version>25.0</version>
</dependency>   

Originally released in July 2013 on code.google.com, the project was migrated to GitHub in March 2015.

Comments
  • Validate connection before usage

    Validate connection before usage

    We are using mysql connector for jdbc. It's implementation of java.sql.connection caches the timezone. In our application we offer the possibility to change the default TimeZone AFTER a connection has been obtained. So we now have a pool of connections with the wrong TimeZone. We need to close those connections and remove them from the pool.

    I now have a GetConnection() hook that throws a ViburDBCPException. I get a new Connection (this is good!) but the Connection that throws the ViburDBCPException is not removed from the pool and is not closed. How can I achieve that?

    question 
    opened by MrKuip 11
  • concurrentlinkedhashmap dependency non-optional when declared as global JNDI Resource

    concurrentlinkedhashmap dependency non-optional when declared as global JNDI Resource

    The pom.xml states that ConcurrentLinkedHashMap dependency is optional:

        <!-- ConcurrentLinkedHashMap dependency is used for JDBC statement caching only,
             that is disabled by default. If the client's application doesn't
             enable the statement caching, it may safely exclude this dependency. -->
        <dependency>
            <groupId>com.googlecode.concurrentlinkedhashmap</groupId>
            <artifactId>concurrentlinkedhashmap-lru</artifactId>
            <version>${concurrentlinkedhashmap-lru.version}</version>
        </dependency>
    

    However when using vibur as a global JNDI resource in tomcat, it is required:

    03-Dec-2015 11:34:15.544 SEVERE [main] org.apache.catalina.startup.Catalina.start The required Server component failed to start so Tomcat is unable to start.
     org.apache.catalina.LifecycleException: Failed to start component [StandardServer[8005]]
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
        at org.apache.catalina.startup.Catalina.start(Catalina.java:625)
        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:497)
        at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:351)
        at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:485)
    Caused by: java.lang.NoClassDefFoundError: com/googlecode/concurrentlinkedhashmap/EvictionListener
        at java.lang.Class.getDeclaredConstructors0(Native Method)
        at java.lang.Class.privateGetDeclaredConstructors(Class.java:2671)
        at java.lang.Class.getConstructor0(Class.java:3075)
        at java.lang.Class.getConstructor(Class.java:1825)
        at org.apache.tomcat.util.modeler.modules.MbeansDescriptorsIntrospectionSource.isBeanCompatible(MbeansDescriptorsIntrospectionSource.java:166)
        at org.apache.tomcat.util.modeler.modules.MbeansDescriptorsIntrospectionSource.supportedType(MbeansDescriptorsIntrospectionSource.java:139)
        at org.apache.tomcat.util.modeler.modules.MbeansDescriptorsIntrospectionSource.initMethods(MbeansDescriptorsIntrospectionSource.java:241)
        at org.apache.tomcat.util.modeler.modules.MbeansDescriptorsIntrospectionSource.createManagedBean(MbeansDescriptorsIntrospectionSource.java:299)
        at org.apache.tomcat.util.modeler.modules.MbeansDescriptorsIntrospectionSource.execute(MbeansDescriptorsIntrospectionSource.java:77)
        at org.apache.tomcat.util.modeler.modules.MbeansDescriptorsIntrospectionSource.loadDescriptors(MbeansDescriptorsIntrospectionSource.java:70)
        at org.apache.tomcat.util.modeler.Registry.load(Registry.java:582)
        at org.apache.tomcat.util.modeler.Registry.findManagedBean(Registry.java:485)
        at org.apache.tomcat.util.modeler.Registry.registerComponent(Registry.java:614)
        at org.apache.catalina.core.NamingContextListener.addResource(NamingContextListener.java:1085)
        at org.apache.catalina.core.NamingContextListener.createNamingContext(NamingContextListener.java:663)
        at org.apache.catalina.core.NamingContextListener.lifecycleEvent(NamingContextListener.java:256)
        at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:95)
        at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
        at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:761)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
        ... 7 more
    Caused by: java.lang.ClassNotFoundException: com.googlecode.concurrentlinkedhashmap.EvictionListener
        at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        ... 27 more
    
    question 
    opened by dcalde 10
  • Consider optimising AbstractInvocationHandler::invoke

    Consider optimising AbstractInvocationHandler::invoke

    On large deployments, due to very high number of executions, AbstractInvocationHandler::invoke shows up a hotspot. Snapshot of the profiler output is given below. Issue is due to the number of times, the if condition is evaluated, causing misses.

    snapshot enhancement 
    opened by rbalamohan 7
  • Statement leak when statement cache is disabled

    Statement leak when statement cache is disabled

    StatementInvocationHandler intercepts the close() method and unless the statement cache is enabled it appears to never close the wrapped statement object:

    https://github.com/vibur/vibur-dbcp/blob/a893a63/src/main/java/org/vibur/dbcp/proxy/StatementInvocationHandler.java#L93

    Could this be a regression introduced by the refactoring in commit e5e4116f8cbdb548a86507ef00b0e9734dbb09ef? Prior to that commit there was an else branch in processClose():

    if (statement.state() != null) { // if this statement is in the cache
        ... mark available in cache and close if already evicted ...
    } else
        closeStatement(rawStatement);
    

    I ran into this when debugging an OutOfMemoryError with the Oracle JDBC driver (which internally holds onto a list of all open statements). Enabling statement cache with setStatementCacheMaxSize seems to be a viable workaround as the statement cache will close the wrapped statement on eviction.

    bug 
    opened by ato 5
  • Hibernate + Vibur + JNDI Datasource

    Hibernate + Vibur + JNDI Datasource

    Hi guys,

     I would like a help to configure my java application so it can use Hibernate with Vibur connecting my database through a JNDI Datasource.
    
     My application is already working without vibur. But when I insert vibur properties to my hibernate.cfg.xml it doesn't work. 
    
    My CFG is like below:
    

    ` org.postgresql.Driver

        <property name="hibernate.current_session_context_class">thread</property>
    	<property name="hibernate.connection.datasource">java:comp/env/jdbc/myDatasource</property>
    
    	<!-- JDBC connection pool (use the built-in) -->
    	<property name="connection.pool_size">10</property>
    
    	<!-- SQL dialect -->
    	<property name="dialect">org.hibernate.dialect.PostgreSQL94Dialect</property>
        
    	<!-- Enable Hibernate's automatic session context management -->
    	<property name="current_session_context_class">thread</property>
    
    	<!-- Vibur DBCP specific properties -->
    	<property name="hibernate.connection.provider_class">
    	    org.vibur.dbcp.integration.ViburDBCPConnectionProvider
    	</property>
    	
    	<property name="hibernate.vibur.poolInitialSize">1</property>
    	<property name="hibernate.vibur.poolMaxSize">300</property>
    	
    	<property name="hibernate.vibur.connectionIdleLimitInSeconds">2</property>
    	<property name="hibernate.vibur.testConnectionQuery">isValid</property>
    	
    	<property name="hibernate.vibur.logQueryExecutionLongerThanMs">500</property>
    	<property name="hibernate.vibur.logStackTraceForLongQueryExecution">true</property>
    	
    	<property name="hibernate.vibur.statementCacheMaxSize">200</property>`
    

    After execute my Tomcat 8.5 server a exception is returned like below:

    org.vibur.dbcp.ViburDBCPException: Unexpected type for configuration property externalDataSource/java:comp/env/jdbc/myDatasource at org.vibur.dbcp.ViburDBCPDataSource.configureFromProperties(ViburDBCPDataSource.java:198) at org.vibur.dbcp.ViburDBCPDataSource.<init>(ViburDBCPDataSource.java:125) at org.vibur.dbcp.integration.ViburDBCPConnectionProvider.configure(ViburDBCPConnectionProvider.java:63) at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:94) at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:241) at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:209) at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.buildJdbcConnectionAccess(JdbcEnvironmentInitiator.java:145) at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:66) at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:35) at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:88) at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:258) at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:232) at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:209) at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:51) at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:94) at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:241) at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:209) at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.handleTypes(MetadataBuildingProcess.java:356) at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:112) at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.build(MetadataBuildingProcess.java:84) at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:470) at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:91) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:691) at util.HibernateUtil.buildSessionFactory(HibernateUtil.java:22) at util.HibernateUtil.<clinit>(HibernateUtil.java:11) at empresa.ControladorEmpresa.<init>(ControladorEmpresa.java:44) at empresa.ControladorEmpresa.getInstance(ControladorEmpresa.java:38) at util.fachadas.Fachada.recuperarUrlCompletaEmpresa(Fachada.java:1085) at util.web.FiltroAcesso.doFilter(FiltroAcesso.java:38) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:610) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81) at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:660) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:798) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:808) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1498) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748)

    My Context.xml is configured like:

    <Resource auth="Container" driverClassName="org.postgresql.Driver" global="jdbc/myDatasource" maxIdle="10" maxTotal="20" maxWaitMillis="-1" name="jdbc/myDatasource" username="postgres" password="123456" type="javax.sql.DataSource" url="jdbc:postgresql://localhost:5432/Database"/>

    anyone could you help me with this problem? Or say how to define an externalDataSource for vibur?

    question 
    opened by rlmf82 4
  • On Demand Validation

    On Demand Validation

    We are currently looking for a new connection pool. We are unhappy with our existing connection pool due to the validation overhead. We configured our exiting connection pool to validate on borrow. We are using Spring JdbcTemplate and as a consequence that happens quite frequently. Our application is a batch application. The validation behaviour we want is the ability to explicitly get a validated connection out of the pool at the start of a batch job. During the batch job the connection no longer needs to be validated, if it becomes invalid throwing an exception is fine as there is no recovery possible.

    question 
    opened by marschall 4
  • Crashes occur when inputs are not integers

    Crashes occur when inputs are not integers

    From vibur-dbcp/src/main/java/org/vibur/dbcp/util/ViburUtils.java

    public static String formatSql(String sqlQuery, List<Object[]> sqlQueryParams) {
        StringBuilder result = new StringBuilder(1024).append("-- ").append(sqlQuery);
    
        if (sqlQueryParams != null && !sqlQueryParams.isEmpty()) {
            Object[] params = sqlQueryParams.toArray();
            Arrays.sort(params, new Comparator<Object>() {
                @Override
                public int compare(Object o1, Object o2) {
                    return Integer.compare((int) ((Object[]) o1)[1], (int) ((Object[]) o2)[1]);
                }
            });
    
            result.append("\n-- Parameters:\n-- ").append(Arrays.deepToString(params));
        }
        return result.toString();
    }
    

    Causes crashes when the input values are not integers.

    bug 
    opened by Reed-Stratix 2
  • Connection proxy doesn't handle exceptions properly

    Connection proxy doesn't handle exceptions properly

    java.lang.reflect.UndeclaredThrowableException
        ... unrelated frames ...
    Caused by: java.lang.reflect.InvocationTargetException
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    	at java.lang.reflect.Method.invoke(Method.java:498)
        ... unrelated frames ...
    	at org.postgresql.jdbc2.AbstractJdbc2Connection.checkClosed(AbstractJdbc2Connection.java:822)
    	at org.postgresql.jdbc2.AbstractJdbc2Connection.getAutoCommit(AbstractJdbc2Connection.java:788)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    	at java.lang.reflect.Method.invoke(Method.java:498)
    	at org.vibur.dbcp.proxy.AbstractInvocationHandler.targetInvoke(AbstractInvocationHandler.java:144)
    

    AbstractInvocationHandle.targetInvoke should be catching InvocationTargetException and throwing its unwrapped getCause() instead of allowing it to escape the proxy, because it is a checked exception that the proxied methods do not declare, causing it to be re-wrapped as an UndeclaredThrowableException. This means that code that tries to catch SQLException fails to, meaning the pool is inadvertently altering the exception behaviour of the methods. It should not do that.

    More detail is available at the internal Atlassian issue https://jdog.jira-dev.com/browse/JEX-30043

    question 
    opened by txshtkckr 2
  • configureFromProperties throws Exception when configured as JNDI resource

    configureFromProperties throws Exception when configured as JNDI resource

    When declared as JNDI resource ViburDBCPDataSource.configureFromProperties() throws a ViburDBCPException, e.g. "Unexpected configuration property: auth"

    <Resource auth="Container" name="jdbc/xxxx" type="javax.sql.DataSource" 
        driverClassName="org.postgresql.Driver" 
        factory="org.vibur.dbcp.ViburDBCPObjectFactory" ...  />
    

    This can either be fixed by excluding all parameters by name in ViburDBCPObjectFactory e.g.

    if("auth".equals(pname)
            || "singleton".equals(pname)
            || "description".equals(pname)
            || "type".equals(pname)
            || "scope".equals(pname)
            || "factory".equals(pname)
            || "closeMethod".equals(pname)) {
        /*
          need to skip these parameters as otherwise org.vibur.dbcp.ViburDBCPDataSource.configureFromProperties()
          throws a ViburDBCPException("Unexpected configuration property: " + key);
         */
        continue;
    }
    

    Or, as this is very cumbersome to maintain across Application Servers, to rather log a warning than throw an Exception

    } catch (NoSuchFieldException e) {
        //throw new ViburDBCPException("Unexpected configuration property: " + key);
        logger.warn("Unexpected configuration property: " + key);
    }
    
    bug 
    opened by dcalde 2
  • Implement support for different usernames and passwords when calling DataSource.getConnection(username, password)

    Implement support for different usernames and passwords when calling DataSource.getConnection(username, password)

    Different usernames and passwords are not supported yet and the call to DataSource.getConnection(username, password) will simply log a warning message and then will create and return a connection using the configured default username and password.

    Using different usernames and passwords for creating connections to a database (from one and the same application) is a rarely used feature, and implementing support for it will be considered based on users requests and demand.

    Until then an obvious workaround will be to use different connection pools for the different usernames and passwords required, i.e. if the application needs a pair of different usernames and passwords for accessing the database, 2 different connection pools can be created and used by the application.

    enhancement 
    opened by simeonmalchev 2
  • SQL Warnings

    SQL Warnings

    Originally pointed out here:

    https://github.com/brettwooldridge/HikariCP/wiki/Pool-Analysis#sql-warnings-2

    A connection pool should clear SQL warnings via Connection.clearWarnings() either when the Connection is returned to the pool or before it is taken from the pool. Vibur does not do this.

    Further comments:

    Determine whether calling Connection.clearWarnings() is necessary, as well as whether it has to happen always or to be configurable.

    bug 
    opened by simeonmalchev 2
  • Bump junit from 4.12 to 4.13.1

    Bump junit from 4.12 to 4.13.1

    Bumps junit from 4.12 to 4.13.1.

    Release notes

    Sourced from junit's releases.

    JUnit 4.13.1

    Please refer to the release notes for details.

    JUnit 4.13

    Please refer to the release notes for details.

    JUnit 4.13 RC 2

    Please refer to the release notes for details.

    JUnit 4.13 RC 1

    Please refer to the release notes for details.

    JUnit 4.13 Beta 3

    Please refer to the release notes for details.

    JUnit 4.13 Beta 2

    Please refer to the release notes for details.

    JUnit 4.13 Beta 1

    Please refer to the release notes for details.

    Commits
    • 1b683f4 [maven-release-plugin] prepare release r4.13.1
    • ce6ce3a Draft 4.13.1 release notes
    • c29dd82 Change version to 4.13.1-SNAPSHOT
    • 1d17486 Add a link to assertThrows in exception testing
    • 543905d Use separate line for annotation in Javadoc
    • 510e906 Add sub headlines to class Javadoc
    • 610155b Merge pull request from GHSA-269g-pwp5-87pp
    • b6cfd1e Explicitly wrap float parameter for consistency (#1671)
    • a5d205c Fix GitHub link in FAQ (#1672)
    • 3a5c6b4 Deprecated since jdk9 replacing constructor instance of Double and Float (#1660)
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • ConcurrentLinkedHashMap --> Caffeine when Java-8 based

    ConcurrentLinkedHashMap --> Caffeine when Java-8 based

    When transitioning to requiring Java 8, please upgrade to Caffeine. The performance should be relatively the same and the per-instance memory usage should be smaller.

    ConcurrentLinkedHashMap changes will continue to be minimal, even more so now, and driven by requests from Java 6 users unable to upgrade. Caffeine is ideally the upgrade path for Guava cache users too, which due to Android cannot be significantly modified.

    enhancement 
    opened by ben-manes 1
Owner
Vibur
Fast and concurrent JDBC connection & object pooling tools
Vibur
🔥 强大的动态线程池,附带监控线程池功能(没有依赖任何中间件)。Powerful dynamic thread pool, does not rely on any middleware, with monitoring thread pool function.

ThreadPool, so easy. 动态线程池监控,主意来源于美团技术公众号 点击查看美团线程池文章 看了文章后深受感触,再加上最近线上线程池的不可控以及不可逆等问题,想做出一个兼容性、功能性、易上手等特性集于一身的的开源项目。目标还是要有的,虽然过程可能会艰辛 目前这个项目是由作者独立开发,

龙台 3.4k Jan 3, 2023
🔥 强大的动态线程池,附带监控线程池功能(没有依赖任何中间件)。Powerful dynamic thread pool, does not rely on any middleware, with monitoring thread pool function.

?? 动态线程池系统,包含 Server 端及 SpringBoot Client 端需引入的 Starter. 动态线程池监控,主意来源于美团技术公众号 点击查看美团线程池文章 看了文章后深受感触,再加上最近线上线程池的不可控以及不可逆等问题,想做出一个 兼容性、功能性、易上手等特性 集于一身的的

龙台 3.4k Jan 3, 2023
FlexyPool adds metrics and failover strategies to a given Connection Pool, allowing it to resize on demand.

Introduction The FlexyPool library adds metrics and flexible strategies to a given Connection Pool, allowing it to resize on demand. This is very hand

Vlad Mihalcea 970 Jan 1, 2023
SPRING MySQL Database Connection using JDBC STEPS

SPRING-MySQL-Database-Connection-using-JDBC-STEPS SPRING MySQL Database Connection using JDBC STEPS Step1: Create maven project Group id: com.cdac Art

Dnyaneshwar Madhewad 1 Jan 27, 2022
MapDB provides concurrent Maps, Sets and Queues backed by disk storage or off-heap-memory. It is a fast and easy to use embedded Java database engine.

MapDB: database engine MapDB combines embedded database engine and Java collections. It is free under Apache 2 license. MapDB is flexible and can be u

Jan Kotek 4.6k Dec 30, 2022
MapDB provides concurrent Maps, Sets and Queues backed by disk storage or off-heap-memory. It is a fast and easy to use embedded Java database engine.

MapDB: database engine MapDB combines embedded database engine and Java collections. It is free under Apache 2 license. MapDB is flexible and can be u

Jan Kotek 4.6k Jan 1, 2023
esProc SPL is a scripting language for data processing, with well-designed rich library functions and powerful syntax, which can be executed in a Java program through JDBC interface and computing independently.

esProc esProc is the unique name for esProc SPL package. esProc SPL is an open-source programming language for data processing, which can perform comp

null 990 Dec 27, 2022
JDBC driver for ClickHouse

This is a basic and restricted implementation of jdbc driver for ClickHouse. It has support of a minimal subset of features to be usable.

ClickHouse 1.1k Jan 1, 2023
Multi-DBMS SQL Benchmarking Framework via JDBC

BenchBase BenchBase (formerly OLTPBench) is a Multi-DBMS SQL Benchmarking Framework via JDBC. Table of Contents Quickstart Description Usage Guide Con

CMU Database Group 213 Dec 29, 2022
Provides many useful CRUD, Pagination, Sorting operations with Thread-safe Singleton support through the native JDBC API.

BangMapleJDBCRepository Inspired by the JpaRepository of Spring framework which also provides many capabilities for the CRUD, Pagination and Sorting o

Ngô Nguyên Bằng 5 Apr 7, 2022
Core ORMLite functionality that provides a lite Java ORM in conjunction with ormlite-jdbc or ormlite-android

ORMLite Core This package provides the core functionality for the JDBC and Android packages. Users that are connecting to SQL databases via JDBC shoul

Gray 547 Dec 25, 2022
Amazon AppFlow Custom JDBC Connector example

Amazon AppFlow Custom JDBC Connector example This project contains source code and supporting files that implements Amazon Custom Connector SDK and re

AWS Samples 6 Oct 26, 2022
Online Quiz system - JDBC, JSP

Online-Quiz-System-in-Java Online Quiz system - JDBC, JSP Java Project based on JDBC, JSP, Java Servlet and Server Deployment Project Aim Develop web

Muhammad Asad 6 Oct 14, 2022
Hi, Spring fans! In this installment, we'll look at how to build tenancy-aware JDBC applications

Multitenant JDBC You'll need to spin up two separate PostgreSQL instances. Put this script into a file called postgres.sh: #!/usr/bin/env bash NAME=${

Spring Tips 19 Nov 7, 2022
A JDBC driver for Cloudflare's D1 product, compatible with Jetbrains tools.

D1 JDBC Driver A JDBC driver for Cloudflare's D1 Database product! JDBC is the technology that drives popular database tools such as Jetbrains' databa

Isaac McFadyen 21 Dec 9, 2022
MixStack lets you connects Flutter smoothly with Native pages, supports things like Multiple Tab Embeded Flutter View, Dynamic tab changing, and more. You can enjoy a smooth transition from legacy native code to Flutter with it.

中文 README MixStack MixStack lets you connects Flutter smoothly with Native pages, supports things like Multiple Tab Embeded Flutter View, Dynamic tab

Yuewen Engineering 80 Dec 19, 2022
HasorDB is a Full-featured database access tool, Providing object mapping,Richer type handling than Mybatis, Dynamic SQL

HasorDB is a Full-featured database access tool, Providing object mapping,Richer type handling than Mybatis, Dynamic SQL, stored procedures, more dialect 20+, nested transactions, multiple data sources, conditional constructors, INSERT strategies, multiple statements/multiple results. And compatible with Spring and MyBatis usage.

赵永春 17 Oct 27, 2022