web analytics

Data, data everywhere 

Twitter LinkedIn RSS
magnify
Home Relational database systems Oracle Configuring SonarQube with Oracle 12c
formats

Configuring SonarQube with Oracle 12c

For a while now I’ve wanted to install SonarQube for doing static analysis of my Java EE 7 applications. The current downloadable version of SonarQube is 5.1.1. The SonarQube requirements documentation indicates that SonarQube supports the following RDBMS for its repository:

  • Microsoft SQL Server 2008 and 2012;
  • Oracle 10g and 11g;
  • MySQL 5.1, 5.5, 5.6, and 5.7;
  • PostgreSQL 8.x and 9.x.

Since I’ve now migrated to Oracle 12c, I thought I would attempt installing SonarQube with Oracle 12c Enterprise Edition 12.1.0.1.0 64-bit on Windows 7.

Setting up the database

SonarQube uses a database system to store metadata about the software projects that it analyzes. Running SonarQube for the first time will create and populate all of the necessary tables; the userid used by the SonarQube process must be able to create various types of objects in the database, including indexes. With Oracle 12c I created a separate pluggable database for Sonarqube. I created a separate user with the DBA role for myself, and a separate user, “sonarqube”, for use by the SonarQube process. To permit the sonarqube account to create all of its necessary objects without issues – there is no documentation outlining precisely what is required – I granted the sonarqube Oracle account a variety of privileges:

1
2
3
4
5
6
7
8
9
10
11
12
GRANT CREATE TABLE TO sonarqube;
GRANT CREATE VIEW, CREATE SYNONYM, CREATE SEQUENCE TO sonarqube;
GRANT CREATE TABLESPACE, ALTER TABLESPACE, DROP TABLESPACE, MANAGE TABLESPACE TO sonarqube;
GRANT CREATE TRIGGER TO sonarqube;
GRANT CREATE PROCEDURE, EXECUTE ANY PROCEDURE TO sonarqube;
GRANT CREATE SESSION, ALTER SESSION TO sonarqube;
GRANT CREATE MATERIALIZED VIEW TO sonarqube;
GRANT CREATE ANY INDEX TO sonarqube;
GRANT CREATE TYPE, EXECUTE ANY TYPE TO sonarqube;
GRANT DEBUG CONNECT SESSION TO sonarqube;
GRANT DEBUG ANY PROCEDURE TO sonarqube;
ALTER USER sonarqube QUOTA UNLIMITED ON SYSTEM;

What also isn’t clear is if SonarQube uses custom DDL statements for each underlying DBMS, or if it relies on Hibernate to issue the DDL. SonarQube 5.1.1 itself contains three object-relational mapping toolkits within its software suite: Java Hibernate 3.3.2, iBatis 3.2.7, and JRuby 1.7.9.

Configuring SonarQube

The SonarQube 5.1.1 install couldn’t be easier – one simply unzips the .zip archive. However, before one can move forward with Oracle 12c there are a number of things to take care of. Most of these involve editing either the sonar.properties or the wrapper.conf files in /conf.

I edited wrapper.conf to explicitly specify the location of my 64-bit Java 7 SDK. Note that one cannot (merely) specify the directory of the JDK; what SonarQube requires is the complete path to java.exe. My edit looks like:

1
wrapper.java.command=/Java/JDK7_71_SE64/bin/java

The sonar.properties file requires a number of edits. For Oracle 12c, the required changes are the userid/password combination for the sonarqube account, along with the JDBC URL. My installation uses the following:

2
3
4
sonar.jdbc.username=sonarqube
sonar.jdbc.password=XXXXXXX
sonar.jdbc.url=jdbc:oracle:thin:@//localhost:1521/sonarqube

Line 4 requires some explanation. Oracle 12c supports “servicename” as a variant for a JDBC URL. As I’ve setup a pluggable database for SonarQube, the PDB name “sonarqube” becomes the servicename in the URL. Note that the leading “//” in the URL are not optional.

I also uncommented a number of settings related to JDBC connection pooling:

5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#----- Connection pool settings
# The maximum number of active connections that can be allocated
# at the same time, or negative for no limit.
sonar.jdbc.maxActive=50
 
# The maximum number of connections that can remain idle in the
# pool, without extra ones being released, or negative for no limit.
sonar.jdbc.maxIdle=5
 
# The minimum number of connections that can remain idle in the pool,
# without extra ones being created, or zero to create none.
sonar.jdbc.minIdle=2
 
# The maximum number of milliseconds that the pool will wait (when there
# are no available connections) for a connection to be returned before
# throwing an exception, or <= 0 to wait indefinitely.
sonar.jdbc.maxWait=5000

In addition to specifying the Oracle connection parameters, I modified the sonar.properties file in a number of other ways:

  1. I explicitly set the port numbers for SonarQube’s embedded Tomcat server, which with the 5.1.1 SonarQube release is Tomcat 8.0.18:
    22
    23
    
    sonar.web.port=9000
    sonar.search.port=9005

    The default SonarQube port is 9000, and is properly reserved. However, the default search port with SonarQube is 9001, which conflicts with Microsoft Sharepoint; so I set it to 9005 instead.

  2. Logging is turned off by default. Logging should be turned on, because otherwise if one has issues with the installation or setup you will have no idea what has occurred, because the SonarQube process will (likely) simply fail to start and you won’t know why.
    24
    25
    26
    
    sonar.path.logs=logs
    sonar.log.rollingPolicy=size:10MB
    sonar.log.maxFiles=7

Finally, I copied my Oracle 12.1.0.1 JDBC driver, ojdbc7.jar, from the Oracle server’s product/12.1.0/dbhome_1/jdbc/lib directory and placed it in the SonarQube directory /extensions/jdbc-driver/oracle as per the installation guide.

With these settings, starting the SonarQube 5.1.1 64-bit executable using the included StartSonar.bat file worked well. The SonarQube process started a JVM instance, connected to the Oracle 12c database, and created all of its tables for project metadata, which I confirmed by connecting to the PDB via SQL Developer. With the message that the SonarQube Tomcat server was up:

SonarQube_shell

I opened a Chrome browser and tried to get to the SonarQube server’s home page. Alas, what I got was this:

oracle12c_jdbc_driver_exception

Fortunately, this null pointer exception problem with Oracle’s JDBC driver in method oracle.jdbc.driver.AutoKeyInfo.initMetaDataColumnIndexes is a known issue and is fixed in version 12.1.0.2 of the Oracle JDBC drivers, which has just been released and can be found here. With the patched JDBC driver copied to the SonarQube /extensions directory, I now have a properly-working SonarQube server.

Takeaways:

  • Get the latest patches for Oracle’s JDBC drivers.
  • Turn on logging with your SonarQube installation.
  • There doesn’t seem to be any issues with using SonarQube 5.1.1 with Oracle 12c.
 
 Share on Facebook Share on Twitter Share on Reddit Share on LinkedIn
6 Comments  comments 

6 Responses

  1. Shuo

    Hi Glenn Paulley:

    I am setting up latest sonarqube server with Oracle12c database. I am also facing the null pointer exception issue from Oracle database. How did you solve that issue? I downloaded the latest jdbc7.jar driver and it seems like release 12.2 has not been launched yet. How did you get latest jdbc.jar file? I really appreciate it.

    Thanks
    Shuo

  2. Weberton

    Thank !! I updated the oracle driver and worked very well

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>