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
  • Fixed statement timeout not working.

    Fixed statement timeout not working.

    This fix relates to one statement timeout issues: https://github.com/jasync-sql/jasync-sql/issues/338 Since QUERY_TIMEOUT was not utilised by the r2dbc-spi, hence have replaced it with STATEMENT_TIMEOUT. As the underlying implementation for STATEMENT_TIMEOUT will remain same as QUERY_TIMEOUT, therefore the underlying logic has not been modified.

    Query timeout was initially add in PR: https://github.com/jasync-sql/jasync-sql/commit/686e20f9169cea37c0dbcca0bbbb9e57099a79df

    opened by kartikarora2 0
  • 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 3
  • 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
  • Statement time out not working as expected

    Statement time out not working as expected

    statementTimeout introduced in release r2dbc-spi v0.9.0.M2 is not working. We are using 0.9.0.RELEASE version of r2dbc-spi and using jasync-sql implementing library. We have set the statement timeout using connection factory options as below.

    Screenshot 2022-12-07 at 12 28 28 AM

    To test statementTimeout we had set set it's value as 1ms. But our query ran for around 12ms, ideally it should have timeout because of the statement timeout parameter and thrown R2dbcTimeoutException. But the query ran successfully.

    We also checked the JasyncClientConnection class where the statement timeout is being set for every session, but the statementtimeout values we had set using connection factory options, does not seem to work.

    https://github.com/jasync-sql/jasync-sql/blob/master/r2dbc-mysql/src/main/java/JasyncClientConnection.kt#L76-L77

    opened by kartikarora2 7
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
A MySQL connector wrapper that supports mapping to Kotlin classes.

Racoon Racoon is a wrapper for the MySQL connector. It makes communicating with the database easier by providing a bunch of functionalities: Mapping q

null 1 Jun 3, 2022
✨ Nifty Utilities and PostgreSQL Extensions for Exposed

✨ ExposedPowerUtils ✨ Utilities and Extensions for Exposed, because while Exposed is a pretty nice framework, it tries to support a lot of SQL dialect

null 9 Nov 8, 2022
JAKO: Just Another Kotlin Orm (PostgreSQL)

JAKO: Just Another Kotlin Orm (PostgreSQL) JAKO is a simple, minimal, no-dependency library to build and execute postgresql statements using a fluent

Alessio 6 May 27, 2022
A blazing fast, powerful, and very simple ORM android database library that writes database code for you.

README DBFlow is fast, efficient, and feature-rich Kotlin database library built on SQLite for Android. DBFlow utilizes annotation processing to gener

Andrew Grosner 4.9k Dec 30, 2022
A blazing fast, powerful, and very simple ORM android database library that writes database code for you.

README DBFlow is fast, efficient, and feature-rich Kotlin database library built on SQLite for Android. DBFlow utilizes annotation processing to gener

Andrew Grosner 4.9k Dec 30, 2022
An Android helper class to manage database creation and version management using an application's raw asset files

THIS PROJECT IS NO LONGER MAINTAINED Android SQLiteAssetHelper An Android helper class to manage database creation and version management using an app

Jeff Gilfelt 2.2k Dec 23, 2022
SquiDB is a SQLite database library for Android and iOS

Most ongoing development is currently taking place on the dev_4.0 branch. Click here to see the latest changes and try out the 4.0 beta. Introducing S

Yahoo 1.3k Dec 26, 2022
A simple ToDo app to demonstrate the use of Realm Database in android to perform some basic CRUD operations like Create, Update and Delete.

Creating a Realm Model Class @RealmClass open class Note() : RealmModel { @PrimaryKey var id: String = "" @Required var title: String

Joel Kanyi 15 Dec 18, 2022
Collection of Kotlin APIs/tools to make using Realm Mobile database easier

Compass Kotlin API and tools to make working with Realm easier Components Compass is designed to make working with Realm easier through collection of

Arunkumar 16 Oct 4, 2022
Room Database Queries with Kotlin Flow

Room Database Queries with Flow This app displays a list of bus stops and arrival times. Tapping a bus stop on the first screen will display a list of

asifj96 0 Apr 26, 2022
Insanely easy way to work with Android Database.

Sugar ORM Insanely easy way to work with Android databases. Official documentation can be found here - Check some examples below. The example applicat

null 2.6k Dec 16, 2022
a 3d database ORM experiment. (used in two commercial projects)

Android-TriOrm a 3d database ORM experiment for Android. (used in two commercial projects). based around small tables concept and JVM Serialization. H

Tomer Shalev 19 Nov 24, 2021
Realm is a mobile database: a replacement for SQLite & ORMs

Realm is a mobile database that runs directly inside phones, tablets or wearables. This repository holds the source code for the Java version of Realm

Realm 11.4k Jan 2, 2023
An Android library that makes developers use SQLite database extremely easy.

LitePal for Android 中文文档 LitePal is an open source Android library that allows developers to use SQLite database extremely easy. You can finish most o

Lin Guo 7.9k Dec 31, 2022
Insanely easy way to work with Android Database.

Sugar ORM Insanely easy way to work with Android databases. Official documentation can be found here - Check some examples below. The example applicat

null 2.6k Jan 9, 2023
Compile time processed, annotation driven, no reflection SQLite database layer for Android

SqliteMagic Simple yet powerful SQLite database layer for Android that makes database handling feel like magic. Overview: Simple, intuitive & typesafe

Siim Kinks 118 Dec 22, 2022
android 数据库框架,sqlite database

DBExecutor 主要的功能 1.使用了读写锁,支持多线程操作数据。 2.支持事务 3.支持ORM 4.缓存Sql,缓存表结构 这个类库主要用于android 数据库操作。 始终围绕着一个类对应一个表的概念。 只要创建一个实体类,就不用当心它怎么存储在数据库中,不用重新写增删改查的代码。基本的功

null 77 May 31, 2021
LiteOrm is a fast, small, powerful ORM framework for Android. LiteOrm makes you do CRUD operarions on SQLite database with a sigle line of code efficiently.

#LiteOrm:Android高性能数据库框架 A fast, small, powerful ORM framework for Android. LiteOrm makes you do CRUD operarions on SQLite database with a sigle line

马天宇 1.5k Nov 19, 2022
An Android library that makes developers use SQLite database extremely easy.

LitePal for Android 中文文档 LitePal is an open source Android library that allows developers to use SQLite database extremely easy. You can finish most o

Lin Guo 7.9k Jan 4, 2023