Java & Kotlin Async DataBase Driver for MySQL and PostgreSQL written in Kotlin

Overview

jasync-sql

Chat at https://gitter.im/jasync-sql/support Maven Central Build Status Apache License V.2 codecov Awesome Kotlin Badge

jasync-sql is a Simple, Netty based, asynchronous, performant and reliable database drivers for PostgreSQL and MySQL written in Kotlin.

Show your with a ★

Getting started

// Connection to MySQL DB
Connection connection = MySQLConnectionBuilder.createConnectionPool(
               "jdbc:mysql://$host:$port/$database?user=$username&password=$password");
     
// Connection to PostgreSQL DB    
Connection connection = PostgreSQLConnectionBuilder.createConnectionPool(
               "jdbc:postgresql://$host:$port/$database?user=$username&password=$password");
// Execute query
CompletableFuture<QueryResult> future = connection.sendPreparedStatement("select * from table");
// work with result ...
// Close the connection pool
connection.disconnect().get()

See a full example at jasync-mysql-example and jasync-postgresql-example.
More samples on the samples dir.

For docs and info see the wiki.

Download

Maven

<!-- mysql -->
<dependency>
  <groupId>com.github.jasync-sql</groupId>
  <artifactId>jasync-mysql</artifactId>
  <version>2.0.3</version>
</dependency>
<!-- postgresql -->
<dependency>
  <groupId>com.github.jasync-sql</groupId>
  <artifactId>jasync-postgresql</artifactId>
  <version>2.0.3</version>
</dependency>

Gradle

dependencies {
  // mysql
  compile 'com.github.jasync-sql:jasync-mysql:2.0.3'
  // postgresql
  compile 'com.github.jasync-sql:jasync-postgresql:2.0.3'
}

Overview

This project is a port of mauricio/postgresql-async to Kotlin.
Why? Because the original lib is not maintained anymore, We use it in ob1k, and would like to remove the Scala dependency in ob1k.

If you want information specific to the drivers, check the PostgreSQL README and the MySQL README.

You can view the project's change log here.

Follow us on twitter: @jasyncs.

DateTime:

Version 1.x always returns JodaTime when dealing with date types and not the java.util.Date class nor jdk-8 dates.
Version 2.x works with java 8 DateTime objects (java.time.LocalDateTime and such).
This post can help with migration.

Who is using it

Add your name here!

Is it used in production on large scale?

jasync-sql-production

The graph above is from only couple of services using it. Y-Axis is # of queries per minute.

There is also a TechEmpower test using ktor and jasync-sql.

Zeko SQL Builder compared jasync to hikary and vertex:
jasync-sql-zeko

Support

More links

Contributing

Pull requests are welcome!
See CONTRIBUTING.

Comments
  • java.lang.ClassCastException: class java.lang.Long cannot be cast to class java.lang.Integer

    java.lang.ClassCastException: class java.lang.Long cannot be cast to class java.lang.Integer

    Using version 2.1.1 of jasync-r2dbc-mysql, I simply followed the steps in https://spring.io/guides/gs/accessing-data-r2dbc/

    My schema.sql is simply:

    CREATE TABLE if not exists `test` (
      `row_id` int NOT NULL AUTO_INCREMENT,
      PRIMARY KEY (`row_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
    

    on running the spring app, I get this:

    Failed to execute SQL script statement #1 of class path resource [schema.sql]: CREATE TABLE if not exists `test` ( `row_id` int NOT NULL AUTO_INCREMENT, PRIMARY KEY (`row_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; nested exception is java.lang.ClassCastException: class java.lang.Long cannot be cast to class java.lang.Integer (java.lang.Long and java.lang.Integer are in module java.base of loader 'bootstrap')
    	at org.springframework.r2dbc.connection.init.ScriptUtils.lambda$runStatement$9(ScriptUtils.java:571)
    	at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:94)
    	at reactor.core.publisher.MonoStreamCollector$StreamCollectorSubscriber.onError(MonoStreamCollector.java:150)
    	at reactor.core.publisher.MonoStreamCollector$StreamCollectorSubscriber.onNext(MonoStreamCollector.java:137)
    	at reactor.core.publisher.FluxFlatMap$FlatMapMain.tryEmitScalar(FluxFlatMap.java:488)
    	at reactor.core.publisher.FluxFlatMap$FlatMapMain.onNext(FluxFlatMap.java:421)
    	at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onNext(FluxOnErrorResume.java:79)
    	at reactor.core.publisher.FluxMap$MapSubscriber.onNext(FluxMap.java:122)
    	at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1816)
    	at reactor.core.publisher.MonoCompletionStage.lambda$subscribe$0(MonoCompletionStage.java:83)
    	at java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:863)
    	at java.base/java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:841)
    	at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)
    	at java.base/java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:2147)
    	at com.github.jasync.sql.db.util.FutureUtilsKt.success(FutureUtils.kt:16)
    	at com.github.jasync.sql.db.mysql.MySQLConnection.succeedQueryPromise$lambda-12(MySQLConnection.kt:359)
    	at java.base/java.util.Optional.ifPresent(Optional.java:178)
    	at com.github.jasync.sql.db.mysql.MySQLConnection.succeedQueryPromise(MySQLConnection.kt:358)
    	at com.github.jasync.sql.db.mysql.MySQLConnection.onOk(MySQLConnection.kt:227)
    	at com.github.jasync.sql.db.mysql.codec.MySQLConnectionHandler.channelRead0(MySQLConnectionHandler.kt:119)
    
    opened by siddjain 22
  • Consider exposing Postgres and MySQL drivers through R2DBC

    Consider exposing Postgres and MySQL drivers through R2DBC

    R2DBC is an initiative to establish a common SPI for relational database drivers embracing reactive programming properties: Event-oriented, non-blocking, and ideally stream-oriented access to databases. R2DBC is built entirely on Reactive Streams defining a minimal API surface to be implemented by drivers without the need to re-implement common client functionality in every driver.

    What is the benefit of doing so?

    Benefits:

    • Following an API that is well-suited for client developers without the need to entirely change how the client is supposed to work
    • Participating in a growing client-ecosystem (MyBatis, draft, JDBI, Spring) with clients providing a humane API. Application developers get a choice of which client they want to use for specific use-cases.
    • Ideomatic usage with Kotlin Coroutines for Reactive Streams.
    • With the choice of clients, jasync-sql isn't required to provide additional functionality such as object mapping or SQL generation. That's up to the client.
    • Choice of plug and play for a growing eco-system of drivers beyond Postgres, MySQL, H2, and Microsoft SQL Server.

    Drawbacks:

    • https://xkcd.com/927/
    • Dependency on Reactive Streams (could be optional, still)
    • Additional complexity by maintaining two driver frontends
    opened by mp911de 22
  •  java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory

    java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory

    When trying to use this library I am getting an error saying

    [21:50:14] [DefaultDispatcher-worker-1/WARN]: [DefaultDispatcher-worker-1] WARN com.github.jasync.sql.db.pool.ActorBasedObjectPool - uncaught Throwable
    [21:50:14] [DefaultDispatcher-worker-1/WARN]: java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory
    [21:50:14] [DefaultDispatcher-worker-1/WARN]:   at io.netty.util.internal.logging.Slf4JLoggerFactory.newInstance(Slf4JLoggerFactory.java:47)
    [21:50:14] [DefaultDispatcher-worker-1/WARN]:   at io.netty.util.internal.logging.InternalLoggerFactory.getInstance(InternalLoggerFactory.java:88)
    [21:50:14] [DefaultDispatcher-worker-1/WARN]:   at io.netty.util.internal.logging.InternalLoggerFactory.getInstance(InternalLoggerFactory.java:81)
    [21:50:14] [DefaultDispatcher-worker-1/WARN]:   at io.netty.bootstrap.Bootstrap.<clinit>(Bootstrap.java:51)
    [21:50:14] [DefaultDispatcher-worker-1/WARN]:   at com.github.jasync.sql.db.mysql.codec.MySQLConnectionHandler.<init>(MySQLConnectionHandler.kt:67)
    [21:50:14] [DefaultDispatcher-worker-1/WARN]:   at com.github.jasync.sql.db.mysql.MySQLConnection.<init>(MySQLConnection.kt:70)
    [21:50:14] [DefaultDispatcher-worker-1/WARN]:   at com.github.jasync.sql.db.mysql.MySQLConnection.<init>(MySQLConnection.kt:51)
    [21:50:14] [DefaultDispatcher-worker-1/WARN]:   at com.github.jasync.sql.db.mysql.pool.MySQLConnectionFactory.create(MySQLConnectionFactory.kt:32)
    [21:50:14] [DefaultDispatcher-worker-1/WARN]:   at com.github.jasync.sql.db.pool.ObjectPoolActor.createObject(ActorBasedObjectPool.kt:507)
    [21:50:14] [DefaultDispatcher-worker-1/WARN]:   at com.github.jasync.sql.db.pool.ObjectPoolActor.createNewItemPutInWaitQueue(ActorBasedObjectPool.kt:491)
    [21:50:14] [DefaultDispatcher-worker-1/WARN]:   at com.github.jasync.sql.db.pool.ObjectPoolActor.handleTake(ActorBasedObjectPool.kt:463)
    [21:50:14] [DefaultDispatcher-worker-1/WARN]:   at com.github.jasync.sql.db.pool.ObjectPoolActor.onReceive(ActorBasedObjectPool.kt:229)
    [21:50:14] [DefaultDispatcher-worker-1/WARN]:   at com.github.jasync.sql.db.pool.ActorBasedObjectPool$actor$1.invokeSuspend(ActorBasedObjectPool.kt:147)
    [21:50:14] [DefaultDispatcher-worker-1/WARN]:   at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
    [21:50:14] [DefaultDispatcher-worker-1/WARN]:   at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
    [21:50:14] [DefaultDispatcher-worker-1/WARN]:   at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:571)
    [21:50:14] [DefaultDispatcher-worker-1/WARN]:   at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:750)
    [21:50:14] [DefaultDispatcher-worker-1/WARN]:   at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:678)
    [21:50:14] [DefaultDispatcher-worker-1/WARN]:   at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:665)
    

    I added compile 'org.slf4j:slf4j-simple:1.7.22' to my build.gradle which made it log the above error. And know that LoggerFactory is being shaded into the jar as I am able to use it.

    LoggerFactory.getLogger(this.getClass()).info("Test");
    Connection connection = MySQLConnectionBuilder.createConnectionPool("jdbc:mysql://127.0.0.1:3306/charms?user=root&password=password");
    try {
      QueryResult result = connection.sendQuery("select * from users;").get();
      for(RowData row: result.getRows()) {
        getLogger().info(row.getString("uuid"));
      }
    } catch (InterruptedException | ExecutionException e) {
      e.printStackTrace();
    }
    

    Any idea why I might be facing this issue?

    no-issue-activity 
    opened by unlimitedcoder2 20
  • Could not read property java.math.BigDecimal

    Could not read property java.math.BigDecimal

    {"timestamp":1553798370728,"path":"/customer/find/2","status":500,"error":"Internal Server Error","message":"Could not read property java.math.BigDecimal com.xp.ws.busi.domain.Customer.amount from result set!"}

    opened by hevan 16
  • Fix connections leaking on high load.

    Fix connections leaking on high load.

    1. Moves the responsibility of connection create timeout completely to the connection.
    2. By doing so, allows us to close the underlying Netty Channel if the creation times out.
    opened by sbmpost 11
  • issue with r2dbc when first column is empty string

    issue with r2dbc when first column is empty string

    I am using the latest version of spring-boot, spring-data-r2dbc and jasync sql

    @GetMapping("/teste")
        fun teste(): Flux<Map<String, Any>> {
            return db.execute("select '' as x,'1' as y ").fetch().all()
        }
    
    2019-10-23 17:31:24.667 ERROR 5845 --- [-netty-thread-1] c.g.jasync.sql.db.mysql.MySQLConnection  : <mysql-connection-1> Transport failure 
    
    java.lang.IndexOutOfBoundsException: readerIndex(3) + length(2) exceeds writerIndex(3): UnpooledSlicedByteBuf(ridx: 3, widx: 3, cap: 3/3, unwrapped: UnpooledByteBufAllocator$InstrumentedUnpooledUnsafeNoCleanerDirectByteBuf(ridx: 75, widx: 84, cap: 512))
    	at io.netty.buffer.AbstractByteBuf.checkReadableBytes0(AbstractByteBuf.java:1495) ~[netty-buffer-4.1.42.Final.jar:4.1.42.Final]
    	at io.netty.buffer.AbstractByteBuf.readShort(AbstractByteBuf.java:764) ~[netty-buffer-4.1.42.Final.jar:4.1.42.Final]
    	at io.netty.buffer.SwappedByteBuf.readShort(SwappedByteBuf.java:546) ~[netty-buffer-4.1.42.Final.jar:4.1.42.Final]
    	at com.github.jasync.sql.db.mysql.decoder.OkDecoder.decode(OkDecoder.kt:17) ~[jasync-mysql-1.0.9.jar:na]
    	at com.github.jasync.sql.db.mysql.codec.MySQLFrameDecoder.doDecoding(MySQLFrameDecoder.kt:184) ~[jasync-mysql-1.0.9.jar:na]
    	at com.github.jasync.sql.db.mysql.codec.MySQLFrameDecoder.handleCommonFlow(MySQLFrameDecoder.kt:169) ~[jasync-mysql-1.0.9.jar:na]
    	at com.github.jasync.sql.db.mysql.codec.MySQLFrameDecoder.decode(MySQLFrameDecoder.kt:97) ~[jasync-mysql-1.0.9.jar:na]
    	at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:505) ~[netty-codec-4.1.42.Final.jar:4.1.42.Final]
    	at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:444) ~[netty-codec-4.1.42.Final.jar:4.1.42.Final]
    	at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:283) ~[netty-codec-4.1.42.Final.jar:4.1.42.Final]
    	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374) [netty-transport-4.1.42.Final.jar:4.1.42.Final]
    	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360) [netty-transport-4.1.42.Final.jar:4.1.42.Final]
    	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:352) [netty-transport-4.1.42.Final.jar:4.1.42.Final]
    	at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1422) [netty-transport-4.1.42.Final.jar:4.1.42.Final]
    	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374) [netty-transport-4.1.42.Final.jar:4.1.42.Final]
    	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360) [netty-transport-4.1.42.Final.jar:4.1.42.Final]
    	at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:931) [netty-transport-4.1.42.Final.jar:4.1.42.Final]
    	at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163) [netty-transport-4.1.42.Final.jar:4.1.42.Final]
    	at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:700) [netty-transport-4.1.42.Final.jar:4.1.42.Final]
    	at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:635) [netty-transport-4.1.42.Final.jar:4.1.42.Final]
    	at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:552) [netty-transport-4.1.42.Final.jar:4.1.42.Final]
    	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:514) [netty-transport-4.1.42.Final.jar:4.1.42.Final]
    	at io.netty.util.concurrent.SingleThreadEventExecutor$6.run(SingleThreadEventExecutor.java:1044) [netty-common-4.1.42.Final.jar:4.1.42.Final]
    	at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) [netty-common-4.1.42.Final.jar:4.1.42.Final]
    	at java.lang.Thread.run(Thread.java:748) [na:1.8.0_191]
    
    
    import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
    
    plugins {
        id("org.springframework.boot") version "2.2.0.RELEASE"
        id("io.spring.dependency-management") version "1.0.8.RELEASE"
        kotlin("jvm") version "1.3.50"
        kotlin("plugin.spring") version "1.3.50"
    }
    
    group = "com.cz"
    version = "0.0.1-SNAPSHOT"
    java.sourceCompatibility = JavaVersion.VERSION_1_8
    
    val developmentOnly by configurations.creating
    configurations {
        runtimeClasspath {
            extendsFrom(developmentOnly)
        }
        compileOnly {
            extendsFrom(configurations.annotationProcessor.get())
        }
    }
    
    repositories {
        mavenCentral()
        maven { url = uri("https://repo.spring.io/milestone") }
    }
    
    dependencies {
        implementation("org.springframework.boot.experimental:spring-boot-actuator-autoconfigure-r2dbc")
        implementation("org.springframework.boot:spring-boot-starter-actuator")
        implementation("org.springframework.boot.experimental:spring-boot-starter-data-r2dbc")
        implementation("org.springframework.boot:spring-boot-starter-webflux")
        implementation("com.github.jasync-sql:jasync-r2dbc-mysql:1.0.9")
    //    {
    //        exclude(group="io.projectreactor.netty")
    //    }
        implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
        implementation("io.micrometer:micrometer-registry-prometheus")
        implementation("org.jetbrains.kotlin:kotlin-reflect")
        implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
        implementation("org.jetbrains.kotlinx:kotlinx-coroutines-reactor")
        developmentOnly("org.springframework.boot:spring-boot-devtools")
        annotationProcessor("org.springframework.boot:spring-boot-configuration-processor")
        testImplementation("org.springframework.boot:spring-boot-starter-test") {
            exclude(group = "org.junit.vintage", module = "junit-vintage-engine")
        }
        testImplementation("org.springframework.boot.experimental:spring-boot-test-autoconfigure-r2dbc")
        testImplementation("io.projectreactor:reactor-test")
    }
    
    dependencyManagement {
        imports {
            mavenBom("org.springframework.boot.experimental:spring-boot-bom-r2dbc:0.1.0.M2")
        }
    }
    
    tasks.withType<Test> {
        useJUnitPlatform()
    }
    
    tasks.withType<KotlinCompile> {
        kotlinOptions {
            freeCompilerArgs = listOf("-Xjsr305=strict")
            jvmTarget = "1.8"
        }
    }
    
    
    opened by ddyycao 11
  • DomainSocket support

    DomainSocket support

    This PR aims to implement support for DomainSockets, using code from https://github.com/jasync-sql/jasync-sql/pull/176.

    But the test code still has some problems. Since the project's dependencies do not include "netty-transport-native-epoll", the Epoll class does not exist even when test on Linux system. Thus, NettyUtils always chose NioSocketChannel.

    But adding "netty-transport-native-epoll" to the dependency will cause some tests for NettyUtils to fail because they are hard-coded and the test code will always determine if NioSocketChannel is returned.

    I'm confused about how to test all the code, both without the domain socket and with it. Further, in order to test domain sockets, then all test code may not work on some systems, such as Windows.

    opened by czp3009 10
  • channelFactory set already

    channelFactory set already

    java.lang.IllegalStateException: channelFactory set already at io.netty.bootstrap.AbstractBootstrap.channelFactory(AbstractBootstrap.java:121) at io.netty.bootstrap.AbstractBootstrap.channelFactory(AbstractBootstrap.java:137) at io.netty.bootstrap.AbstractBootstrap.channel(AbstractBootstrap.java:109) at com.github.jasync.sql.db.mysql.codec.MySQLConnectionHandler.connect(MySQLConnectionHandler.kt:84) at com.github.jasync.sql.db.mysql.MySQLConnection.connect(MySQLConnection.kt:116) at com.wind.telegram.framework.asyncdao.mysql.pool.ConnectionPool.getConnection(ConnectionPool.java:68) at com.wind.telegram.framework.asyncdao.proxy.MapperProxy.getConnection(MapperProxy.java:218) at com.wind.telegram.framework.asyncdao.proxy.MapperProxy.execute(MapperProxy.java:231) at com.wind.telegram.framework.asyncdao.proxy.MapperProxy.invoke(MapperProxy.java:83) at com.sun.proxy.$Proxy42.queryById(Unknown Source) at com.wind.telegram.schedule.job.MessageSchedule.send(MessageSchedule.java:47) at com.wind.telegram.schedule.job.JobHandler.sendMessageJobHandler(JobHandler.java:37) at jdk.internal.reflect.GeneratedMethodAccessor81.invoke(Unknown Source) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at com.xxl.job.core.handler.impl.MethodJobHandler.execute(MethodJobHandler.java:31) at com.xxl.job.core.thread.JobThread.run(JobThread.java:163)

    no-issue-activity 
    opened by wind-hx 10
  • Any query causes BufferNotFullyConsumedException

    Any query causes BufferNotFullyConsumedException

    Hello,

    I am trying to migrate a small project from JDBC to R2DBC using this project's MySQL driver. When deploying to production I am having issues executing any queries at all, as I am getting this exception:

    com.github.jasync.sql.db.exceptions.BufferNotFullyConsumedException: Buffer was not fully consumed by decoder, 39 bytes to read
            at com.github.jasync.sql.db.mysql.codec.MySQLFrameDecoder.doDecoding(MySQLFrameDecoder.kt:193) ~[jasync-mysql-1.0.2.jar!/:na]
            at com.github.jasync.sql.db.mysql.codec.MySQLFrameDecoder.handleCommonFlow(MySQLFrameDecoder.kt:158) ~[jasync-mysql-1.0.2.jar!/:na]
            at com.github.jasync.sql.db.mysql.codec.MySQLFrameDecoder.decode(MySQLFrameDecoder.kt:94) ~[jasync-mysql-1.0.2.jar!/:na]
            at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:502) ~[netty-codec-4.1.36.Final.jar!/:4.1.36.Final]
            at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:441) ~[netty-codec-4.1.36.Final.jar!/:4.1.36.Final]
            at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:278) ~[netty-codec-4.1.36.Final.jar!/:4.1.36.Final]
            at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374) ~[netty-transport-4.1.36.Final.jar!/:4.1.36.Final]
            at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360) ~[netty-transport-4.1.36.Final.jar!/:4.1.36.Final]
            at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:352) ~[netty-transport-4.1.36.Final.jar!/:4.1.36.Final]
            at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1408) ~[netty-transport-4.1.36.Final.jar!/:4.1.36.Final]
            at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374) ~[netty-transport-4.1.36.Final.jar!/:4.1.36.Final]
            at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360) ~[netty-transport-4.1.36.Final.jar!/:4.1.36.Final]
            at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:930) ~[netty-transport-4.1.36.Final.jar!/:4.1.36.Final]
            at io.netty.channel.epoll.AbstractEpollStreamChannel$EpollStreamUnsafe.epollInReady(AbstractEpollStreamChannel.java:796) ~[netty-transport-native-epoll-4.1.36.Final-linux-x86_64.jar!/:4.1.36.Final]
            at io.netty.channel.epoll.EpollEventLoop.processReady(EpollEventLoop.java:432) ~[netty-transport-native-epoll-4.1.36.Final-linux-x86_64.jar!/:4.1.36.Final]
            at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:333) ~[netty-transport-native-epoll-4.1.36.Final-linux-x86_64.jar!/:4.1.36.Final]
            at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:906) ~[netty-common-4.1.36.Final.jar!/:4.1.36.Final]
            at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[netty-common-4.1.36.Final.jar!/:4.1.36.Final]
            at java.base/java.lang.Thread.run(Thread.java:844) ~[na:na]
    

    I was getting this exception on my local machine previously, but it somehow disappeared after recreating the database's docker image.

    Example code:

    client.execute().sql("SELECT @@VERSION;")
                    .fetch()
                    .all()
                    .subscribe(System.out::println)
    

    The client is a DatabaseClient provided by Spring, and is based off of this configuration:

    override fun connectionFactory(): ConnectionFactory {
         val configuration = URLParser.parseOrDie(props.dbUrl, StandardCharsets.UTF_8)
        return JasyncConnectionFactory(MySQLConnectionFactory(configuration))
    }
    

    The MySQL version in both production and on my local machine is 8.0.12, as provided from the latest docker image. My version of jasync-r2dbc-mysql is 1.0.2.

    opened by freyacodes 10
  • Failed to start Spring Boot(3.0.0-M5) application using jasync-r2dbc-mysql(2.1.1)

    Failed to start Spring Boot(3.0.0-M5) application using jasync-r2dbc-mysql(2.1.1)

    Steps to reproduce:

    Please checkout from repo https://github.com/JohnNiang/jasync-mysql-reprod to reproduce.

    Version

    https://github.com/jasync-sql/jasync-sql/releases/tag/2.1.1.

    Log details

    022-09-26T14:44:02.791+08:00  INFO 28128 --- [  restartedMain] ConditionEvaluationReportLoggingListener : 
    
    Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
    2022-09-26T14:44:02.806+08:00 ERROR 28128 --- [  restartedMain] o.s.boot.SpringApplication               : Application run failed
    
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'r2dbcScriptDatabaseInitializer' defined in class path resource [org/springframework/boot/autoconfigure/sql/init/R2dbcInitializationConfiguration.class]: reactor/core/publisher/MonoExtensionsKt
    	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1754) ~[spring-beans-6.0.0-M6.jar:6.0.0-M6]
    	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:599) ~[spring-beans-6.0.0-M6.jar:6.0.0-M6]
    	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:521) ~[spring-beans-6.0.0-M6.jar:6.0.0-M6]
    	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326) ~[spring-beans-6.0.0-M6.jar:6.0.0-M6]
    	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-6.0.0-M6.jar:6.0.0-M6]
    	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324) ~[spring-beans-6.0.0-M6.jar:6.0.0-M6]
    	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200) ~[spring-beans-6.0.0-M6.jar:6.0.0-M6]
    	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:931) ~[spring-beans-6.0.0-M6.jar:6.0.0-M6]
    	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:926) ~[spring-context-6.0.0-M6.jar:6.0.0-M6]
    	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:592) ~[spring-context-6.0.0-M6.jar:6.0.0-M6]
    	at org.springframework.boot.web.reactive.context.ReactiveWebServerApplicationContext.refresh(ReactiveWebServerApplicationContext.java:66) ~[spring-boot-3.0.0-M5.jar:3.0.0-M5]
    	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:751) ~[spring-boot-3.0.0-M5.jar:3.0.0-M5]
    	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:442) ~[spring-boot-3.0.0-M5.jar:3.0.0-M5]
    	at org.springframework.boot.SpringApplication.run(SpringApplication.java:314) ~[spring-boot-3.0.0-M5.jar:3.0.0-M5]
    	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1323) ~[spring-boot-3.0.0-M5.jar:3.0.0-M5]
    	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1312) ~[spring-boot-3.0.0-M5.jar:3.0.0-M5]
    	at run.halo.app.Application.main(Application.java:24) ~[classes/:na]
    	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
    	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
    	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
    	at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
    	at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) ~[spring-boot-devtools-3.0.0-M5.jar:3.0.0-M5]
    Caused by: java.lang.NoClassDefFoundError: reactor/core/publisher/MonoExtensionsKt
    	at com.github.jasync.r2dbc.mysql.JasyncConnectionFactory.create$lambda-1(JasyncConnectionFactory.kt:14) ~[jasync-r2dbc-mysql-2.1.1.jar:na]
    	at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:44) ~[reactor-core-3.5.0-M6.jar:3.5.0-M6]
    	at reactor.core.publisher.Mono.subscribe(Mono.java:4379) ~[reactor-core-3.5.0-M6.jar:3.5.0-M6]
    	at reactor.core.publisher.FluxConcatArray$ConcatArraySubscriber.onComplete(FluxConcatArray.java:258) ~[reactor-core-3.5.0-M6.jar:3.5.0-M6]
    	at reactor.core.publisher.FluxConcatArray.subscribe(FluxConcatArray.java:78) ~[reactor-core-3.5.0-M6.jar:3.5.0-M6]
    	at reactor.core.publisher.Flux.subscribe(Flux.java:8515) ~[reactor-core-3.5.0-M6.jar:3.5.0-M6]
    	at reactor.core.publisher.Flux.subscribeWith(Flux.java:8636) ~[reactor-core-3.5.0-M6.jar:3.5.0-M6]
    	at reactor.core.publisher.Flux.subscribe(Flux.java:8481) ~[reactor-core-3.5.0-M6.jar:3.5.0-M6]
    	at reactor.core.publisher.Flux.subscribe(Flux.java:8405) ~[reactor-core-3.5.0-M6.jar:3.5.0-M6]
    	at reactor.pool.SimpleDequePool.drainLoop(SimpleDequePool.java:451) ~[reactor-pool-1.0.0-M6.jar:1.0.0-M6]
    	at reactor.pool.SimpleDequePool.pendingOffer(SimpleDequePool.java:598) ~[reactor-pool-1.0.0-M6.jar:1.0.0-M6]
    	at reactor.pool.SimpleDequePool.doAcquire(SimpleDequePool.java:294) ~[reactor-pool-1.0.0-M6.jar:1.0.0-M6]
    	at reactor.pool.AbstractPool$Borrower.request(AbstractPool.java:430) ~[reactor-pool-1.0.0-M6.jar:1.0.0-M6]
    	at reactor.core.publisher.MonoFlatMap$FlatMapMain.request(MonoFlatMap.java:194) ~[reactor-core-3.5.0-M6.jar:3.5.0-M6]
    	at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.request(FluxOnAssembly.java:649) ~[reactor-core-3.5.0-M6.jar:3.5.0-M6]
    	at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.request(FluxOnAssembly.java:649) ~[reactor-core-3.5.0-M6.jar:3.5.0-M6]
    	at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.set(Operators.java:2339) ~[reactor-core-3.5.0-M6.jar:3.5.0-M6]
    	at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.onSubscribe(Operators.java:2213) ~[reactor-core-3.5.0-M6.jar:3.5.0-M6]
    	at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onSubscribe(FluxOnAssembly.java:633) ~[reactor-core-3.5.0-M6.jar:3.5.0-M6]
    	at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onSubscribe(FluxOnAssembly.java:633) ~[reactor-core-3.5.0-M6.jar:3.5.0-M6]
    	at reactor.core.publisher.MonoFlatMap$FlatMapMain.onSubscribe(MonoFlatMap.java:117) ~[reactor-core-3.5.0-M6.jar:3.5.0-M6]
    	at reactor.pool.SimpleDequePool$QueueBorrowerMono.subscribe(SimpleDequePool.java:716) ~[reactor-pool-1.0.0-M6.jar:1.0.0-M6]
    	at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:64) ~[reactor-core-3.5.0-M6.jar:3.5.0-M6]
    	at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52) ~[reactor-core-3.5.0-M6.jar:3.5.0-M6]
    	at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:64) ~[reactor-core-3.5.0-M6.jar:3.5.0-M6]
    	at reactor.core.publisher.FluxRetry$RetrySubscriber.resubscribe(FluxRetry.java:117) ~[reactor-core-3.5.0-M6.jar:3.5.0-M6]
    	at reactor.core.publisher.MonoRetry.subscribeOrReturn(MonoRetry.java:50) ~[reactor-core-3.5.0-M6.jar:3.5.0-M6]
    	at reactor.core.publisher.Mono.subscribe(Mono.java:4364) ~[reactor-core-3.5.0-M6.jar:3.5.0-M6]
    	at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:103) ~[reactor-core-3.5.0-M6.jar:3.5.0-M6]
    	at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onError(FluxOnAssembly.java:544) ~[reactor-core-3.5.0-M6.jar:3.5.0-M6]
    	at reactor.core.publisher.MonoFlatMap$FlatMapMain.onError(MonoFlatMap.java:180) ~[reactor-core-3.5.0-M6.jar:3.5.0-M6]
    	at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onError(FluxOnAssembly.java:544) ~[reactor-core-3.5.0-M6.jar:3.5.0-M6]
    	at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onError(FluxMapFuseable.java:142) ~[reactor-core-3.5.0-M6.jar:3.5.0-M6]
    	at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onError(FluxOnAssembly.java:544) ~[reactor-core-3.5.0-M6.jar:3.5.0-M6]
    	at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onError(FluxOnAssembly.java:544) ~[reactor-core-3.5.0-M6.jar:3.5.0-M6]
    	at reactor.core.publisher.Operators.error(Operators.java:198) ~[reactor-core-3.5.0-M6.jar:3.5.0-M6]
    	at reactor.core.publisher.MonoError.subscribe(MonoError.java:53) ~[reactor-core-3.5.0-M6.jar:3.5.0-M6]
    	at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:64) ~[reactor-core-3.5.0-M6.jar:3.5.0-M6]
    	at reactor.core.publisher.MonoDeferContextual.subscribe(MonoDeferContextual.java:55) ~[reactor-core-3.5.0-M6.jar:3.5.0-M6]
    	at reactor.core.publisher.Mono.subscribe(Mono.java:4379) ~[reactor-core-3.5.0-M6.jar:3.5.0-M6]
    	at reactor.core.publisher.MonoUsingWhen.subscribe(MonoUsingWhen.java:96) ~[reactor-core-3.5.0-M6.jar:3.5.0-M6]
    	at reactor.core.publisher.Mono.subscribe(Mono.java:4379) ~[reactor-core-3.5.0-M6.jar:3.5.0-M6]
    	at reactor.core.publisher.Mono.block(Mono.java:1674) ~[reactor-core-3.5.0-M6.jar:3.5.0-M6]
    	at org.springframework.boot.r2dbc.init.R2dbcScriptDatabaseInitializer.runScripts(R2dbcScriptDatabaseInitializer.java:71) ~[spring-boot-3.0.0-M5.jar:3.0.0-M5]
    	at org.springframework.boot.sql.init.AbstractScriptDatabaseInitializer.runScripts(AbstractScriptDatabaseInitializer.java:145) ~[spring-boot-3.0.0-M5.jar:3.0.0-M5]
    	at org.springframework.boot.sql.init.AbstractScriptDatabaseInitializer.applyScripts(AbstractScriptDatabaseInitializer.java:107) ~[spring-boot-3.0.0-M5.jar:3.0.0-M5]
    	at org.springframework.boot.sql.init.AbstractScriptDatabaseInitializer.applySchemaScripts(AbstractScriptDatabaseInitializer.java:97) ~[spring-boot-3.0.0-M5.jar:3.0.0-M5]
    	at org.springframework.boot.sql.init.AbstractScriptDatabaseInitializer.initializeDatabase(AbstractScriptDatabaseInitializer.java:75) ~[spring-boot-3.0.0-M5.jar:3.0.0-M5]
    	at org.springframework.boot.sql.init.AbstractScriptDatabaseInitializer.afterPropertiesSet(AbstractScriptDatabaseInitializer.java:65) ~[spring-boot-3.0.0-M5.jar:3.0.0-M5]
    	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1800) ~[spring-beans-6.0.0-M6.jar:6.0.0-M6]
    	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1750) ~[spring-beans-6.0.0-M6.jar:6.0.0-M6]
    	... 21 common frames omitted
    Caused by: java.lang.ClassNotFoundException: reactor.core.publisher.MonoExtensionsKt
    	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) ~[na:na]
    	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) ~[na:na]
    	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520) ~[na:na]
    	... 72 common frames omitted
    
    Disconnected from the target VM, address: '127.0.0.1:44143', transport: 'socket'
    
    Process finished with exit code 0
    
    opened by JohnNiang 9
  • Add PostgreSQL Schema support

    Add PostgreSQL Schema support

    Add PostgreSQL schema support to the library.

    It's search_path in the actual data you send to postgres.

    I'll try and PR this soon but I'm not used to Kotlin.

    opened by Yomanz 9
  • Missing R2dbcExceptions mapping

    Missing R2dbcExceptions mapping

    In commit: https://github.com/jasync-sql/jasync-sql/pull/116/files#diff-48ac27ec5f7ffa2729c94453b580b09eed8a1a59e32d3836d52d83ba0e91d6b5, file: r2dbc-mysql/src/main/java/JasyncStatement.kt,

    If MySQLException is catched, R2dbcTransientExceptions like R2dbcTimeoutException, R2dbcRollbackException and R2dbcTransientResourceException are not mapped properly because of which each of them falls in JasyncDatabaseException.

    Because of which, springframework.r2dbc (org.springframework:spring-r2dbc v5.3.19) always throws them as UncategorizedR2dbcException, whereas in ideal case it should be throwing them as QueryTimeoutException, ConcurrencyFailureException and TransientDataAccessResourceException respectively.

    opened by pearlgupta2000 1
  • r2bc-mysql close connection on query conflict

    r2bc-mysql close connection on query conflict

    This is an implementation of what @oshai suggested in the following comment: https://github.com/jasync-sql/jasync-sql/pull/343#issuecomment-1347020196

    As @oshai mentioned in the above thread, we may take advantage of an implicit rollback when ROLLBACK query conflict with other running queries.

    I prefer this version to the second (https://github.com/jasync-sql/jasync-sql/pull/345) one. This solution is more simple, stable, and less side effects.

    Thank you @oshai for a good idea to start with.

    opened by FutureGadget 4
  • query promise chaining

    query promise chaining

    As @oshai suggested at https://github.com/jasync-sql/jasync-sql/pull/343#issuecomment-1347020196, I implemented query chaining. This can solve the problem mentioned in https://github.com/jasync-sql/jasync-sql/pull/343#issuecomment-1346877775 without introducing scheduler and query execution queue.

    opened by FutureGadget 1
  • backporting fix to 2.0.8 due for spring 2.x compatibility

    backporting fix to 2.0.8 due for spring 2.x compatibility

    Hi @oshai , Raising this issue to backport fixes to 2.0.8 so that fixes are available for Spring Boot 2.X applications. As we know it will take a lot of time for companies to move to Spring Boot 3.X hence supporting all the fixes( only bugfixes or security enhancements) will be good otherwise it gets little problematic.

    Let me know what you think?

    opened by sushilnayak 5
  • r2dbc-mysql queueing execution of queries

    r2dbc-mysql queueing execution of queries

    This is my suggested fix for issue https://github.com/jasync-sql/jasync-sql/issues/255#issuecomment-1336219534.

    Since in reactor environment, multiple threads can access to the same connection unintendedly, I added a queue per JasyncClientConnection.

    opened by FutureGadget 4
Releases(2.1.8)
  • 2.1.8(Dec 12, 2022)

    What's Changed

    • [Moss-Panusitt] update readme guide maven download for spring boot r2dbc-mysql by @bamossza in https://github.com/jasync-sql/jasync-sql/pull/334
    • build(deps): bump assertJ to 3.23.1 by @yeikel in https://github.com/jasync-sql/jasync-sql/pull/321
    • change postgis version to 14-3.2 by @oshai in https://github.com/jasync-sql/jasync-sql/pull/341

    New Contributors

    • @bamossza made their first contribution in https://github.com/jasync-sql/jasync-sql/pull/334

    Full Changelog: https://github.com/jasync-sql/jasync-sql/compare/2.1.7...2.1.8

    Source code(tar.gz)
    Source code(zip)
  • 2.1.7(Oct 13, 2022)

    What's Changed

    • update ktlint to 11.0.0 by @oshai in https://github.com/jasync-sql/jasync-sql/pull/326
    • postgis support by @oshai in https://github.com/jasync-sql/jasync-sql/pull/327

    Full Changelog: https://github.com/jasync-sql/jasync-sql/compare/2.1.6...2.1.7

    Source code(tar.gz)
    Source code(zip)
  • 2.1.6(Oct 11, 2022)

    What's Changed

    • add r2dbc test by @oshai in https://github.com/jasync-sql/jasync-sql/pull/317
    • Cleanups by @oshai in https://github.com/jasync-sql/jasync-sql/pull/318
    • build(deps): bump jacoco to 0.8.8 by @yeikel in https://github.com/jasync-sql/jasync-sql/pull/320
    • build(deps): bump junit to 4.13.2 by @yeikel in https://github.com/jasync-sql/jasync-sql/pull/323
    • build(deps): bump joda to 2.2.2 by @yeikel in https://github.com/jasync-sql/jasync-sql/pull/322
    • Unix Domain Socket by @oshai in https://github.com/jasync-sql/jasync-sql/pull/319

    New Contributors

    • @yeikel made their first contribution in https://github.com/jasync-sql/jasync-sql/pull/320

    Full Changelog: https://github.com/jasync-sql/jasync-sql/compare/2.1.5...2.1.6

    Source code(tar.gz)
    Source code(zip)
  • 2.1.5(Oct 5, 2022)

    What's Changed

    • change onErrorMap,toFlux import by @oshai in https://github.com/jasync-sql/jasync-sql/pull/316

    Full Changelog: https://github.com/jasync-sql/jasync-sql/compare/2.1.3...2.1.5

    Source code(tar.gz)
    Source code(zip)
  • 2.1.3(Oct 5, 2022)

    What's Changed

    • change toMono import by @oshai in https://github.com/jasync-sql/jasync-sql/pull/315

    Full Changelog: https://github.com/jasync-sql/jasync-sql/compare/2.1.2...2.1.3

    Source code(tar.gz)
    Source code(zip)
  • 2.1.2(Oct 5, 2022)

    What's Changed

    • Update REACTOR_CORE_VERSION=3.4.23 by @oshai in https://github.com/jasync-sql/jasync-sql/pull/314

    Full Changelog: https://github.com/jasync-sql/jasync-sql/compare/2.1.1...2.1.2

    Source code(tar.gz)
    Source code(zip)
  • 2.1.1(Sep 19, 2022)

    What's Changed

    • fix(r2dbc) #306 - query timeout might be null by @oshai in https://github.com/jasync-sql/jasync-sql/pull/307

    Full Changelog: https://github.com/jasync-sql/jasync-sql/compare/2.1.0...2.1.1

    Source code(tar.gz)
    Source code(zip)
  • 2.1.0(Sep 18, 2022)

    What's Changed

    • update r2dbc to 1.0.0 by @oshai in https://github.com/jasync-sql/jasync-sql/pull/304

    Full Changelog: https://github.com/jasync-sql/jasync-sql/compare/2.0.8...2.1.0

    Source code(tar.gz)
    Source code(zip)
  • 2.0.8(May 31, 2022)

    What's Changed

    • Bump Version by @DebitCardz in https://github.com/jasync-sql/jasync-sql/pull/295
    • Fix connections leaking on high load. by @sbmpost in https://github.com/jasync-sql/jasync-sql/pull/290

    New Contributors

    • @sbmpost made their first contribution in https://github.com/jasync-sql/jasync-sql/pull/290

    Full Changelog: https://github.com/jasync-sql/jasync-sql/compare/2.0.7...2.0.8

    Source code(tar.gz)
    Source code(zip)
  • 2.0.7(May 20, 2022)

    What's Changed

    • Bump Version by @DebitCardz in https://github.com/jasync-sql/jasync-sql/pull/286
    • upgrade versions by @oshai in https://github.com/jasync-sql/jasync-sql/pull/293

    New Contributors

    • @DebitCardz made their first contribution in https://github.com/jasync-sql/jasync-sql/pull/286

    Full Changelog: https://github.com/jasync-sql/jasync-sql/compare/2.0.6...2.0.7

    Source code(tar.gz)
    Source code(zip)
  • 2.0.6(Jan 16, 2022)

    What's Changed

    • fix flaky test - close the connection only if there is no errors by @oshai in https://github.com/jasync-sql/jasync-sql/pull/281
    • Add currentSchema to ConnectionPoolConfiguration by @Yomanz in https://github.com/jasync-sql/jasync-sql/pull/282

    Full Changelog: https://github.com/jasync-sql/jasync-sql/compare/2.0.5...2.0.6

    Source code(tar.gz)
    Source code(zip)
  • 2.0.5(Jan 11, 2022)

    What's Changed

    • Add schema support by @Yomanz in https://github.com/jasync-sql/jasync-sql/pull/259
    • fixes to search path test by @oshai in https://github.com/jasync-sql/jasync-sql/pull/279

    New Contributors

    • @Yomanz made their first contribution in https://github.com/jasync-sql/jasync-sql/pull/259

    Full Changelog: https://github.com/jasync-sql/jasync-sql/compare/2.0.4...2.0.5

    Source code(tar.gz)
    Source code(zip)
  • 2.0.4(Nov 28, 2021)

  • 2.0.3(Nov 27, 2021)

    What's Changed

    • Switch to JSR 310 Date and Time API by @dragneelfps in https://github.com/jasync-sql/jasync-sql/pull/233
    • More Joda removals by @oshai in https://github.com/jasync-sql/jasync-sql/pull/249
    • Add environment vars to postgresql-async test suite by @e-mbrown in https://github.com/jasync-sql/jasync-sql/pull/265
    • add ci via github actions #269 by @oshai in https://github.com/jasync-sql/jasync-sql/pull/270
    • add release job by @oshai in https://github.com/jasync-sql/jasync-sql/pull/271

    New Contributors

    • @dragneelfps made their first contribution in https://github.com/jasync-sql/jasync-sql/pull/233
    • @e-mbrown made their first contribution in https://github.com/jasync-sql/jasync-sql/pull/265

    Full Changelog: https://github.com/jasync-sql/jasync-sql/compare/1.2.3...2.0.3

    Source code(tar.gz)
    Source code(zip)
Owner
null
R2DBC Driver for Oracle Database

About Oracle R2DBC The Oracle R2DBC Driver is a Java library that supports reactive programming with Oracle Database. Oracle R2DBC implements the R2DB

Oracle 159 Dec 13, 2022
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
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
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
A tool based on mysql-connector to simplify the use of databases, tables & columns

Description A tool based on mysql-connector to simplify the use of databases, tables & columns. This tool automatically creates the databases & tables

nz 6 Nov 17, 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
Java implementation of Condensation - a zero-trust distributed database that ensures data ownership and data security

Java implementation of Condensation About Condensation enables to build modern applications while ensuring data ownership and security. It's a one sto

CondensationDB 43 Oct 19, 2022
H2 is an embeddable RDBMS written in Java.

Welcome to H2, the Java SQL database. The main features of H2 are: Very fast, open source, JDBC API Embedded and server modes; disk-based or in-memory

H2 Database Engine 3.6k Jan 5, 2023
eXist Native XML Database and Application Platform

eXist-db Native XML Database eXist-db is a high-performance open source native XML database—a NoSQL document database and application platform built e

eXist-db.org 363 Dec 30, 2022
Transactional schema-less embedded database used by JetBrains YouTrack and JetBrains Hub.

JetBrains Xodus is a transactional schema-less embedded database that is written in Java and Kotlin. It was initially developed for JetBrains YouTrack

JetBrains 1k Dec 14, 2022
CrateDB is a distributed SQL database that makes it simple to store and analyze massive amounts of machine data in real-time.

About CrateDB is a distributed SQL database that makes it simple to store and analyze massive amounts of machine data in real-time. CrateDB offers the

Crate.io 3.6k Jan 2, 2023
Transactional schema-less embedded database used by JetBrains YouTrack and JetBrains Hub.

JetBrains Xodus is a transactional schema-less embedded database that is written in Java and Kotlin. It was initially developed for JetBrains YouTrack

JetBrains 858 Mar 12, 2021
Free universal database tool and SQL client

DBeaver Free multi-platform database tool for developers, SQL programmers, database administrators and analysts. Supports any database which has JDBC

DBeaver 29.8k Jan 1, 2023
The Prometheus monitoring system and time series database.

Prometheus Visit prometheus.io for the full documentation, examples and guides. Prometheus, a Cloud Native Computing Foundation project, is a systems

Prometheus 46.3k Jan 10, 2023
Database Subsetting and Relational Data Browsing Tool.

Jailer Database Tool Jailer is a tool for database subsetting and relational data browsing. The Subsetter exports consistent, referentially intact row

Wisser 1.5k Jan 7, 2023
Database with Java Swing UI that stores consumables (food & drink) using RESTful API to send commands via HTTP

Database with Java Swing UI that stores consumables (food & drink) using RESTful API to send commands via HTTP.

Bryan 2 Mar 8, 2022