How to generate a cylinder with several holes except by knife tool and Boolean methods
Create two inner circles
Extrude and scale a border around the inner circles
Bridge the inner circles together with two segments.  Note the number of edges in the perimeter of the resulting mesh.
Create an outer circle with a larger radius.  Use the same number vertices as the perimeter in step 3.  Extrude and scale a border.
Bridge the outer and inner circles together.
Extrude the whole mesh in Z-axis to create a cylinder.
Add supporting edge loops around hard edges.
Apply subdivision surface modifier and you're done.