简体   繁体   中英

Hibernate performace - to many select queries in console log

I think that I have problem with hibernate performance. Maybe I am doing something wrong. I am using Spring 4 and Hibernate 4. I have two tables in database, Driver and Fleet connected ManyToMany. Table DRIVER_FLEET connects them bout and consist of driverID and fleetID.

Here is the example, from class Driver, that represents how my connection looks like.

@ManyToMany(fetch = FetchType.LAZY, cascade=CascadeType.PERSIST)  
    @JoinTable(name="DRIVER_FLEET", 
                        joinColumns= { @JoinColumn(name="driverID")}, 
                        inverseJoinColumns={@JoinColumn(name="fleetID")}) 
        private List<Fleet> fleet = new ArrayList<Fleet>(); 
    public List<Fleet> getFleet() {
        return fleet;
    }
    public void setFleet(List<Fleet> fleet) {
        this.fleet = fleet;
    }

Here is class Fleet:

@ManyToMany(mappedBy = "Driver")
    public Set<Driver> getDriver() {
        return getDriver();
    }

Now when I save Driver and Fleet into database using hibernate save(), I have this result in console:

Hibernate: select driver0_.driverID as driverID1_2_, driver0_.commision as commisio2_2_, driver0_.dateOfBirth as dateOfBi3_2_, driver0_.driverDriveRateAmount as driverDr4_2_, driver0_.driverDriveRateCurrency as driverDr5_2_, driver0_.driverNumber as driverNu6_2_, driver0_.driverPayRateAmount as driverPa7_2_, driver0_.driverPayRateCurrency as driverPa8_2_, driver0_.driverPerOrderAmount as driverPe9_2_, driver0_.driverPerOrderCurrency as driverP10_2_, driver0_.firstName as firstNa11_2_, driver0_.gender as gender12_2_, driver0_.lastName as lastNam13_2_, driver0_.middleInitials as middleI14_2_ from Driver driver0_
Hibernate: select fleet0_.driverID as driverID1_2_0_, fleet0_.fleetID as fleetID2_0_0_, fleet1_.fleetID as fleetID1_3_1_, fleet1_.fleetName as fleetNam2_3_1_ from DRIVER_FLEET fleet0_ inner join Fleet fleet1_ on fleet0_.fleetID=fleet1_.fleetID where fleet0_.driverID=?
Hibernate: select fleet0_.driverID as driverID1_2_0_, fleet0_.fleetID as fleetID2_0_0_, fleet1_.fleetID as fleetID1_3_1_, fleet1_.fleetName as fleetNam2_3_1_ from DRIVER_FLEET fleet0_ inner join Fleet fleet1_ on fleet0_.fleetID=fleet1_.fleetID where fleet0_.driverID=?
Hibernate: select fleet0_.driverID as driverID1_2_0_, fleet0_.fleetID as fleetID2_0_0_, fleet1_.fleetID as fleetID1_3_1_, fleet1_.fleetName as fleetNam2_3_1_ from DRIVER_FLEET fleet0_ inner join Fleet fleet1_ on fleet0_.fleetID=fleet1_.fleetID where fleet0_.driverID=?
Hibernate: select fleet0_.driverID as driverID1_2_0_, fleet0_.fleetID as fleetID2_0_0_, fleet1_.fleetID as fleetID1_3_1_, fleet1_.fleetName as fleetNam2_3_1_ from DRIVER_FLEET fleet0_ inner join Fleet fleet1_ on fleet0_.fleetID=fleet1_.fleetID where fleet0_.driverID=?
Hibernate: select fleet0_.driverID as driverID1_2_0_, fleet0_.fleetID as fleetID2_0_0_, fleet1_.fleetID as fleetID1_3_1_, fleet1_.fleetName as fleetNam2_3_1_ from DRIVER_FLEET fleet0_ inner join Fleet fleet1_ on fleet0_.fleetID=fleet1_.fleetID where fleet0_.driverID=?
Hibernate: select driver0_.driverID as driverID1_2_, driver0_.commision as commisio2_2_, driver0_.dateOfBirth as dateOfBi3_2_, driver0_.driverDriveRateAmount as driverDr4_2_, driver0_.driverDriveRateCurrency as driverDr5_2_, driver0_.driverNumber as driverNu6_2_, driver0_.driverPayRateAmount as driverPa7_2_, driver0_.driverPayRateCurrency as driverPa8_2_, driver0_.driverPerOrderAmount as driverPe9_2_, driver0_.driverPerOrderCurrency as driverP10_2_, driver0_.firstName as firstNa11_2_, driver0_.gender as gender12_2_, driver0_.lastName as lastNam13_2_, driver0_.middleInitials as middleI14_2_ from Driver driver0_
Hibernate: select fleet0_.driverID as driverID1_2_0_, fleet0_.fleetID as fleetID2_0_0_, fleet1_.fleetID as fleetID1_3_1_, fleet1_.fleetName as fleetNam2_3_1_ from DRIVER_FLEET fleet0_ inner join Fleet fleet1_ on fleet0_.fleetID=fleet1_.fleetID where fleet0_.driverID=?
Hibernate: select fleet0_.driverID as driverID1_2_0_, fleet0_.fleetID as fleetID2_0_0_, fleet1_.fleetID as fleetID1_3_1_, fleet1_.fleetName as fleetNam2_3_1_ from DRIVER_FLEET fleet0_ inner join Fleet fleet1_ on fleet0_.fleetID=fleet1_.fleetID where fleet0_.driverID=?
Hibernate: select fleet0_.driverID as driverID1_2_0_, fleet0_.fleetID as fleetID2_0_0_, fleet1_.fleetID as fleetID1_3_1_, fleet1_.fleetName as fleetNam2_3_1_ from DRIVER_FLEET fleet0_ inner join Fleet fleet1_ on fleet0_.fleetID=fleet1_.fleetID where fleet0_.driverID=?
Hibernate: select fleet0_.driverID as driverID1_2_0_, fleet0_.fleetID as fleetID2_0_0_, fleet1_.fleetID as fleetID1_3_1_, fleet1_.fleetName as fleetNam2_3_1_ from DRIVER_FLEET fleet0_ inner join Fleet fleet1_ on fleet0_.fleetID=fleet1_.fleetID where fleet0_.driverID=?
Hibernate: select fleet0_.driverID as driverID1_2_0_, fleet0_.fleetID as fleetID2_0_0_, fleet1_.fleetID as fleetID1_3_1_, fleet1_.fleetName as fleetNam2_3_1_ from DRIVER_FLEET fleet0_ inner join Fleet fleet1_ on fleet0_.fleetID=fleet1_.fleetID where fleet0_.driverID=?
Hibernate: insert into Driver (commision, dateOfBirth, driverDriveRateAmount, driverDriveRateCurrency, driverNumber, driverPayRateAmount, driverPayRateCurrency, driverPerOrderAmount, driverPerOrderCurrency, firstName, gender, lastName, middleInitials) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: insert into DRIVER_LICENSE (expirationDate, stateIssued, driverID, licenseID) values (?, ?, ?, ?)
Hibernate: insert into DRIVER_FLEET (driverID, fleetID) values (?, ?)

From this console log you can see that I have two many these rows

Hibernate: select fleet0_.driverID as driverID1_2_0_, fleet0_.fleetID as fleetID2_0_0_, fleet1_.fleetID as fleetID1_3_1_, fleet1_.fleetName as fleetNam2_3_1_ from DRIVER_FLEET fleet0_ inner join Fleet fleet1_ on fleet0_.fleetID=fleet1_.fleetID where fleet0_.driverID=?

The problem is, if I have more rows in table DRIVER_FLEET, then I have more rows of those select queries. Is there some possibility that I have made something wrong in ManyToMany connection? Can my performance be better?

While we wait for @Milan to update his question as @JBNizet points out some serious problems, lets attempt long shot answer:

Just because you find multiple repeated lines in your log it does not mean the event happend more than once. Under some circumstances, your logging framework may log multiple messages for single event.

For example when you set multiple loggers on different depth of class package like this:

<configuration>

  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%msg%n</pattern>
    </encoder>
  </appender>

  <logger name="chapters">
    <appender-ref ref="STDOUT" />
  </logger>

  <logger name="chapters.configuration">
    <appender-ref ref="STDOUT" />
  </logger>

  <logger name="chapters.configuration.Foo">
    <appender-ref ref="STDOUT" />
  </logger>

  <root level="debug">
    <appender-ref ref="STDOUT" />
  </root>
</configuration>

You would get the event 4x in console with Logback as the logging is cumulative by default, see additivity="false" for fix.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM