JSF + Spring + DataSource.getConnection

Hi,

wollt mal fragen wie man Connections mit JSF und Spring am besten Verwaltet.

Mein Dao schaut in etwa so aus:

public class QuestionDao {

protected IAnswerDao _AnswerDao;
protected Connection _Connection;
public QuestionDao(Connection connection, IAnswerDao answerDao) {
    _AnswerDao = answerDao;
    _Connection = connection;
}
public Question create(Question entity) {
[...]
    PreparedStatement prepStatAttachment;
    long attachmentid = -1;
    try {
        prepStatAttachment = _Connection.prepareStatement(insertAttachment);
        ResultSet executeQuery = prepStatAttachment.executeQuery();
        executeQuery.next();
        attachmentid = executeQuery.getLong(1);
        entity.setAttachmentId(attachmentid);
        prepStatAttachment.close();

    } catch (SQLException ex) {
        LOGGER.error("create: Shit hit the fan when creating the attachment.", ex);
    }
    finally
    {
      if(prepstatattachment !=null) try {prepStatAttachment.close();}
    }
    [...]

Mein Spring config sieht dann so aus:

<bean id="QuestionDao" class="code.elephant.dao.QuestionDao">
    <constructor-arg value="#{dataSource.getConnection()}" index="0" />
    <constructor-arg ref="AnswerDao" index="1" />
</bean>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="org.postgresql.Driver" />
    <property name="url" value="jdbc:postgresql:// />
    <property name="username" value="" />
    <property name="password" value=""/>
</bean>

Meine Frage, ist das handling von der getConnection so richtig?

Wenn du schon mit Spring und JDBC arbeitest, dann solltest du auf jeden Fall das JdbcTemplate verwenden.
Das JdbcTemplate kannst du dann als Bean injizieren. In der Verlinkten Dokumentation unter JdbcTemplate best practices steht, dass man das Template auch als Singletonbean deklarieren darf und die Instanz entsprechend teilen kann.
Du brauchst dann gar nicht mehr mit den Datasources herumhantieren, maximal einmal bei der Erzeugung der Templateinstanz bzw. bei der Definition des ConnectionPools.

Dann müsste ich überall wo ich ein _Connection.prepareStatement habe, durch ein passendes this.jdbcTemplate.queryForObject ersetzen?

Bzw. die übergeben gar nicht die connection sondern die DataSource im Dao Konstruktor.
Könnte ich nicht weiterhin die Connection im Konstruktor verwenden wenn diese vom org.apache.commons.dbcp.BasicDataSource bean injeziert wird?

Ja, so ist es. Die verlinkte Dokumentation ist da recht anwenderfreundlich und bietet gute Beispiele.

Die Connection direkt zu verwenden, macht keinen Sinn, weil in der DataSource gepoolt wird. Um die zurückgegebene Connection ist noch ein Wrapper, der das Schließen der Verbindung verhindert und die Verbindung dann an den Pool zurückgibt. Wenn du die DataSource nicht verwendest, verwendest du den Pool auch nicht.