On Fri, Sep 4, 2020 at 8:43 AM Felix Schumacher <
felix.schumac...@internetallee.de> wrote:

>
> Am 03.09.20 um 22:00 schrieb Philippe Mouawad:
> > Hello Felix,
> >
> > Thanks for answer, just 2 notes:
> >
> >    - I guess rollback should be named commit (just a matter of naming)
> >    - More important, do we need to put a "commit"  in Query for  Query
> >    Type: Commit, reading the code I am not sure text is used  ?:
> >       -
> >
> https://github.com/apache/jmeter/blob/master/src/protocol/jdbc/src/main/java/org/apache/jmeter/protocol/jdbc/AbstractJDBCTestElement.java#L224
>
>
> I am not sure, what you mean by this. In my example, I used rollback
> instead of commit, as I think it shows the way the samplers work more
> nicely.
>
Just that the name of the element is rollback and Query Type is commit.

>
> The OP wanted to have commit, so my comment (... (or commit) ...) was a
> placeholder to show, where the type has to be changed (and the name of
> the sampler should be changed, too).
>
ok

>
> I think the documentation could be made clearer, that the special types
> commit, rollback, autocommit(true) and autocommit(false) are really that
> (special) and will ignore the given content of the sql statements.


I agree

> And
> while we are at it, the sql field could be disabled when the special
> types are selected.
>
As it's a Generic TestBeanGU I am afraid it might not be that easy to do

>
> For the OP the most important take away is probably, that
> autocommit(false) switches the current connection into transaction mode,
> that has to be either committed or rollbacked and that the type to use
> in his scenario would have been "commit" AND that the sql statement in
> the special typed samplers are ignored.
>
> The "begin; create ...; commit" as init sql -- in my example -- was
> needed, as the connections are initialized in transaction mode
> (autocommit(false)) and I really wanted to create the table.
>

Yes very clear, I didn't say anything about that
Thanks

>
> Felix
>
>
> >
> >
> > Regards
> >
> > On Thu, Sep 3, 2020 at 9:33 PM Felix Schumacher <
> > felix.schumac...@internetallee.de> wrote:
> >
> >> Am 03.09.20 um 18:16 schrieb Brian Flowers:
> >>> Hi everyone,
> >>>
> >>> I'm having some issues using JMeter to insert some records in a MariaDB
> >>> database with autocommit disabled (the idea being that we want to
> commit
> >>> every ~1000 records, not after each one).
> >>>
> >>> Did some searches and couldn't find any documentation or tutorials
> >>> explaining this...I got desperate enough to ask on StackOverflow :) but
> >>> the only response so far seems to indicate that I'm configuring it
> >>> correctly:
> >>> https://stackoverflow.com/questions/63713516/jmeter-jdbc-manual-commit
> >>>
> >>> I started with JMeter 3.2 connecting via the mysql connector version
> >>> 5.1.27 as that's what we already had...I realize those are pretty old,
> >>> so I did try upgrading, but got the same results. Tried on JMeter 5.3
> >>> with mysql connector 8.0.21, and also with the dedicated mariadb
> >>> connector version 2.11.3 (all connectors from the Maven repository).
> >>> With auto commit true, any combination of those versions works fine.
> >>> With auto commit false, I can't get my data committed on any of them.
> >>>
> >>> What I have set up right now is a thread group with one thread, than
> >>> contains a JDBC request with a single INSERT statement, using a couple
> >>> variables that it takes from a csv data set and a counter, on a
> constant
> >>> throughput timer, and I'm using the loop count in the thread group to
> >>> control the number of records inserted. When I have auto commit set to
> >>> true in the JDBC configuration, the records all get inserted just fine.
> >>> But when I turn auto commit off, I can't get those statements
> committed.
> >>> I set the JDBC request query type to "AutoCommit(false)" instead of
> >>> "Update Statement", then I added a second JDBC request on the same
> >>> configuration with request type of "Commit". In the results tree I can
> >>> see a commit statement following each insert statement with no errors,
> >>> but the records don't actually get committed in the DB. I tried adding
> >>> the commit inside the original JDBC request (just to see if that'd
> work)
> >>> but that gave a SQL error; I tried adding a commit post processor
> within
> >>> the main JDBC request, but no luck there. I tried adding a
> pre-processor
> >>> to open a transaction, assuming that it wasn't including the commit and
> >>> the insert on the same transaction, but no change with that. I tried
> >>> configuration transaction isolation as DEFAULT or as
> >>> TRANSACTION_SERIALIZABLE but that had no apparent effect either.
> >>>
> >>> So...how do I manually commit an insert statement on a mariaDB
> database?
> >>> Or what else can I check to try to diagnose exactly what is going on
> >>> here? Are there any resources or documentation about exactly how to use
> >>> the autocommit setting?
> >> I have (tried) to attach a minimal test plan, that works for me. It was
> >> tested with a MariaDB in a docker instance, that I started with
> >>
> >>  $ docker run --rm -p 3306:3306 -e MYSQL_ROOT_PASSWORD=my-secret-pw -ti
> >> mariadb
> >>
> >> I then added  a database named db to it with a mysql client
> >>
> >>  $ docker exec  mydb /bin/bash -c 'echo "create database db;" | mysql
> >> --password=my-secret-pw'
> >>
> >> In the test plan I have one thread group with one thread. It contains a
> >> jdbc config which has set autocommit to false and a name of db. I used a
> >> init sql statement to create a table:
> >>
> >> begin; create table if not exists person (id int, name text); commit;
> >>
> >> and filled in the database connection parameters
> >>
> >> url: jdbc:mysql://localhost:3306/db
> >> driver class: com.mysql.jdbc.Driver
> >> username: root
> >> password: my-secret-pw
> >>
> >> (Oh, and don't forget to add the driver jar somewhere JMeter can find it
> >> ;))
> >>
> >> Now, for the logic I added loop controller named loop and placed an jdbc
> >> sampler into it.
> >>
> >> That sampler was named "insert data" and had set the auto commit field
> >> set to false. Its type was prepared update statement and the query was
> >> "insert into person values (?, ?)". Parameter values and types were
> >> ${__jm__loop__idx},${__RandomString(10,abcdefghijklmnopqrstuvwxyz,)} and
> >> INTEGER,VARCHAR.
> >>
> >> After the loop I verified that the transaction had all the data with a
> >> jdbc sampler named "view data", that had the type set to select
> >> statement and the query "select * from person".
> >>
> >> Now to rollback (or commit), I used another jdbc sampler called "roll
> >> back" with a query type of "Rollback".
> >>
> >> To verify that rollback worked. I added a last jdbc sampler named "view
> >> data (again)" with the same type and statement as "view data".
> >>
> >> As I wanted to see all those requests and their responses, I added a
> >> tree results view.
> >>
> >> So, reading your message correctly, I think you want to try changing the
> >> query type of your statements back to update/select and adding a commit
> >> typed query every once in a while.
> >>
> >> Felix
> >>
> >>> Thanks!
> >>> Brian Flowers
> >>> jmeter-s...@bsflowers.net
> >>>
> >>>
> >>> ---------------------------------------------------------------------
> >>> To unsubscribe, e-mail: user-unsubscr...@jmeter.apache.org
> >>> For additional commands, e-mail: user-h...@jmeter.apache.org
> >>>
> >> ---------------------------------------------------------------------
> >> To unsubscribe, e-mail: user-unsubscr...@jmeter.apache.org
> >> For additional commands, e-mail: user-h...@jmeter.apache.org
> >
> >
>


-- 
Cordialement
Philippe M.
Ubik-Ingenierie

Reply via email to