The classic way to access a kdb server from java is via the c class. The jdbc implementation makes it easy to interface with a kdb database providing higher level methods to establish a database connection, parse the returned object. One drawback is that it does not support retrieving result that is not a table. Let’s go over a short guide on how to use jdbc to connect to kdb.
kdb Server
First let’s start a kdb process to which the java client will connect over TCP port 7000. You can choose any port you like.
We are going to use Spring Boot with jdbc starter. Spring boot further simplifies the code by configuring Spring automatically wherever possible. spring-boot-starter-jdbc provides support for jdbc.
<?xml version="1.0" encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>spring-kdb</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><name>spring-kdb</name><description>Demo project for Spring kdb Integration</description><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.3.3.RELEASE</version><relativePath/><!-- lookup parent from repository --></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
Configuring Datasource
The jdbc driver for kdb not available in maven. It can be downloaded from kx repository. You can add it as a build dependency or add to your local maven repo and use it as a maven dependency. I am going to use the first approach.
Configure the driver class name and server URL in the application.properties file.
Spring boot will automatically configure the datasource class from the application.properties and you can use @Autowired annotation to pass it to a jdbcTemplate.
We are using RowCallbackHandler as we shall be processing the rows immediately. You can do away with all the SQL cuteness and run q statements directly by prefixing q statements with q). All the exceptions from the jdbc class are thrown as runtime exceptions. An SQLException is generated if execution of the query fails. Apart from that NullPointerException is generated if a statement returns nothing upon execution such as assignment expressions somevar:10; and ClassCastException is thrown if you try to retrieve anything other than a table. Here I am handling only the SQLExceptions and masking all the others - which generally is not a good practice.
You need to first start the kdb server. You can run the client within eclipse or as a jar: